OpenGL ES纹理贴图

来源:互联网 发布:火焰切割圆弧怎么编程 编辑:程序博客网 时间:2024/03/28 23:11

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() 

eg调用如下: 
    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.纹理映射过程 
(待补充)
平面贴纹理,mipmap 


0 0