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的功能
概括的说, 纹理映射机制允许你将一个图像关联到一个多边形上,从而呈现出真实视觉效果。例如, 你可以将书的封面图像应用到一个方形上, 这样这个方形看起来就像是一本书了。 你可以将地球的地图通过纹理映射应用到一个球体上, 那么这个球体就是一个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();