您的位置:首页 > 运维架构

OpenGL ES纹理贴图

2014-04-30 15:29 344 查看
OpenGL可以把纹理映射到指定的图形的表面上。简单一点的,就是给平面映射纹理,比如一个四边形,一个长方体的6个面,都可以指定位图作为纹理映射到各个面上,下面简单介绍相关的函数

1、glGenTextures函数 

 void glGenTextures(GLsizei n, GLuint * textures); 

 函数参数的含义: 

 n —— 生成的纹理的名称的个数; 

 textures —— 生成的纹理名称所存储位置的指针,也就是一个纹理数组的内存地址,或者说是数组首元素的内存地址。 

 函数被调用,会生成一系列纹理的名字,并存储到指定的数组中。 
2、glBindTexture函数 

 glBindTexture函数实现了将调用glGenTextures函数生成的纹理的名字绑定到对应的目标纹理上。该函数的声明如下所示: 

 void glBindTexture(GLenum target,GLuint texture); 

 函数参数的含义: 

 target —— 纹理被绑定的目标,它只能取值GL_TEXTURE_1D或者GL_TEXTURE_2D; 

 texture —— 纹理的名称,并且,该纹理的名称在当前的应用中不能被再次使用。

3、glTexImage2D函数 

 调用glTexImage2D函数,用来指定二维纹理图像。该函数的声明如下所示: 

 void glTexImage2D( 

 GLenum target,        

 GLint level,          

 GLint components,     

 GLsizei width,        

 GLsizei height,       

 GLint border,         

 GLenum format,        

 GLenum type,          

 const GLvoid *pixels ); 

 函数参数的含义: 

 target —— 指定目标纹理,必须为GL_TEXTURE_2D; 

 level —— 指定图像级别的编号,0表示基本图像,其它可以参考MSDN; 

 components —— 纹理中颜色组件的编号,可是是1或2或3或4; 

 width —— 纹理图像的宽度; 

 height —— 纹理图像的高度; 

 border —— 纹理图像的边框宽度,必须是0或1; 

 format —— 指定像素数据的格式,一共有9个取值:GL_COLOR_INDEX、GL_RED、GL_GREEN、GL_BLUE、GL_ALPHA、GL_RGB、  GL_RGBA、GL_BGR_EXT、GL_BGRA_EXT、GL_LUMINANCE、GL_LUMINANCE_ALPHA ,具体含义可以参考MSDN; 

 type —— 像素数据的数据类型,取值可以为GL_UNSIGNED_BYTE, GL_BYTE, GL_BITMAP, GL_UNSIGNED_SHORT, GL_SHORT,  GL_UNSIGNED_INT, GL_INT, and GL_FLOAT; 

 pixels —— 内存中像素数据的指针。

4、glTexParameteri函数 

 glTexParameteri函数或者glTexParameterf函数用来设置纹理参数,声明如下所示: 

 void glTexParameterf( GLenum target,GLenum pname, GLfloat param ); 

 void glTexParameteri( GLenum target, GLenum pname, GLint param); 

 函数参数的含义: 

 target —— 目标纹理,必须为GL_TEXTURE_1D或GL_TEXTURE_2D; 

 pname —— 用来设置纹理映射过程中像素映射的问题等,取值可以为:GL_TEXTURE_MIN_FILTER、GL_TEXTURE_MAG_FILTER、  GL_TEXTURE_WRAP_S、GL_TEXTURE_WRAP_T,详细含义可以查看MSDN; 

 param —— 实际上就是pname的值,可以参考MSDN。 

 另外,该类函数还有两个: 

 void glTexParameterfv()

 void glTexParameteriv() 

 egl调用如下: 

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 

 功能就是实现线形滤波的功能,当纹理映射到图形表面以后,如果因为其它条件的设置导致纹理不能更好地显示的时候,进行过滤,按照指定的方式 进行显示,可能会过滤掉显示不正常的纹理像素。 

5.glEGLImageTargetTexture2DOES函数

 该函数可以完成相当于一般情况下的glTexImage2D的效果

 EGLImage代表一种由EGL客户API(如OpenGL,OpenVG)创建的共享资源类型,它的本意是共享2D图像数据。

  关于EGLImage的一种使用情景就是通过它来创建一个2D纹理:

 eglCreateImageKHR
(EGLDisplay dpy, EGLContext ctx,  EGLenum target,EGLClientBuffer
buffer, const EGLint *attrib_list)

 其中,target决定了创建纹理的方式,buffer是图像数据,可以是一块gembuffer或者tbm
surface

 eg: image = eglCreateImage(EVAS_GL_NATIVE_SURFACE, tbm, NULL);
 glBindTexture(GL_TEXTURE_2D, ad->texture);
 glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, image);//类似glTexImage2D的功能

6.纹理映射过程 

概括的说, 纹理映射机制允许你将一个图像关联到一个多边形上,从而呈现出真实视觉效果。例如, 你可以将书的封面图像应用到一个方形上, 这样这个方形看起来就像是一本书了。 你可以将地球的地图通过纹理映射应用到一个球体上, 那么这个球体就是一个3D的具真实感的地球了。纹理映射在当今的3D图形应用上处处皆是。游戏都是通过纹理映射来作为虚拟真实的第一个步骤。

 纹理映射是一个二维的数组。数组中的每一项称之为纹理点( texel )。 虽然这个数组是二维的, 但是可以映射到非二维的对象上, 如球体或者其他的 3D 对象模型上。

 比较常见的是, 开发者在他们的图形应用中运用二维纹理, 当然一维或者三维的纹理也并非未闻。二维纹理有宽度和高度决定二维。一维纹理也有宽度和高度, 只是高度被设为值1(单位:像素 pixel). 而三维纹理不仅具有宽度和高度, 还有深度, 所以三维为纹理又称为立体纹理。我们讨论的主要是二维纹理
      确定纹理坐标:

 glTexCoord2f(1.of,1.Of);glVertex3f(1.Of,1.Of,0.Of);比如这一句话.对于设置纹理贴图的坐标和绘图坐标的确定问题.一般的
 情况假设纹理和图片都是正方形的,那么我们希望纹理映射到整个物体上面,这个时候纹理坐标按照逆时针放心依次(0,0),(1,0),(1,1),(0,1),其  中的四个坐标只是代表的向量,并不是真实的坐标,如果是要一半贴到物体上就应该是0.5的值了,假如你给的纹理坐标大于1,那么将会贴多个纹
 理,比如值为2的时候,会有4个纹理贴图.

glBegin(GL_POLYGON);

        glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.5f,
0.5f, 0.5f);//左下角

        glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f,
0.5f, 0.5f); // 右下角

        glTexCoord2f(1.0f, 1.0f); glVertex3f(0.5f,
0.5f, -0.5f);// 右上角

        glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f,
0.5f, -0.5f);// 左上角

glEnd();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息