首页 > 代码库 > OpenGL_ES-纹理

OpenGL_ES-纹理


                                            OpenGL_ES2.0 -纹理



:纹理基础:


         1: 纹素的概念:

       一个二维纹理在OpenGLES2.0中是非经常见的,二维纹理就是一个二维数组,每一个数据元素称为纹素,详细格式例如以下:

GL_RGB (Red, Green, Blue)

GL_RGBA (Red, Green, Blue, Alpha)

GL_LUMINANCE (Luminance亮度)

GL_LUMINANCE_ALPHA(Luminance, Alpha)

GL_ALPHA (Alpha)


2:纹理坐标概念:


技术分享










        3: 天空盒的概念:

               天空盒由六个面组成。每一个面是一个二维纹理,纹理坐标的算法是由中心点取一条射线。与面的交点即是纹理坐标。


:加载纹理和多级纹理技术

第一步: 创建纹理对象。

glGenTextures(GLsizein, GLuint *textures)

删除纹理对象。

glDeleteTextures(GLsizein, GLuint *textures)


第二步: 绑定纹理对象。

glBindTexture(GLenumtarget, GLuint texture)


第三步: 向显卡传输纹理数据

glTexImage2D(GLenumtarget, GLint level,

     GLenuminternalFormat, GLsizei width,

     GLsizeiheight, GLint border,

     GLenumformat, GLenum type, const void* pixels)


代码样例:

//纹理对象句柄

GLuinttextureId;

//2 x 2 图像,3 字节 每一个像素(R,G, B)

GLubytepixels[4 * 3] =

{

    255,0,0,// 红

    0,255,0,// 绿

    0,0,255, // 蓝

    255,255,0// 黄

};

//使用紧密包装数据

glPixelStorei(GL_UNPACK_ALIGNMENT,1);

//生成纹理对象

glGenTextures(1,&textureId);

//绑定纹理对象

glBindTexture(GL_TEXTURE_2D,textureId);

//加载纹理(向GPU传送)

glTexImage2D(GL_TEXTURE_2D,0, GL_RGB, 2, 2, 0, GL_RGB,

GL_UNSIGNED_BYTE,pixels);

//设置纹理过滤(稍后会讲到)

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST);



:纹理过滤和包装

         非常多时候。我们把一个图片贴到一个模型上。并不刚好合适。那么就须要调整, 调整往往包括两个方面,大小缩放以及包装模式设置。

glTexParameteri(GLenumtarget, GLenum pname, GLint param)

glTexParameteriv(GLenumtarget, GLenum pname, const GLint *params)

glTexParameterf(GLenumtarget, GLenum pname, GLfloat param)

glTexParameterfv(GLenumtarget, GLenum pname, const GLfloat *params)

          生成多级纹理。 在LOD中会用到:

             glGenerateMipmap(GLenumtarget)



:在片段着色器中使用纹理

         在片段着色器中能够使用纹理。 详细使用过程例如以下:

         第一步: 绑定到当前纹理, 然后帮当期纹理对象句柄传递给一致变量。

        
//找到一致变量

userData->samplerLoc= glGetUniformLocation(

userData->programObject,"s_texture");

//...

//绑定纹理对象

glActiveTexture(GL_TEXTURE0);

glBindTexture(GL_TEXTURE_2D,userData->textureId);

//设置纹理对象句柄(纹理单元)到一致变量

glUniform1i(userData->samplerLoc,0);

 


            第二步:写Shader,利用Shader提供的系统函数使用纹理  texture2D(sampler2Dsampler, vec2 coord[,float bias])

GLbytevShaderStr[] =

"attributevec4 a_position;\n"

"attributevec2 a_texCoord;\n"

"varyingvec2 v_texCoord;\n"

"voidmain()

"{

"

gl_Position= a_position;

"

v_texCoord= a_texCoord;

"}


GLbytefShaderStr[] =

"precisionmediump float;\n"

"varyingvec2 v_texCoord;\n"

"uniformsampler2D s_texture;\n"

"voidmain()\n"

"{\n"

"gl_FragColor = texture2D(s_texture, v_texCoord); \n""}\n";



:纹理子图指定

glTexSubImage2D(GLenumtarget, GLint level,

     GLint xoffset,GLint yoffset,

     GLsizei width,GLsizei height,

     GLenum format,GLenum type, const void* pixels)

              这个函数同意更新纹理图形的一部分,效率比glTexImage2D要高。





:从颜色缓冲区读取纹理数据

        这部分和帧缓冲区相关, 还与像素缓冲区相关,OpenGLES提供了两个函数同意从颜色缓冲区读取数据到纹理,假设进一步了解缓冲区知识的话。相信您会知  道開始像素缓冲区。拷贝过程效率更高一些。

         glCopyTexImage2D(GLenumtarget, GLint level,

             GLenuminternalFormat, GLint x,

             GLint y,GLsizei width,

             GLsizeiheight, GLint border )


glCopyTexSubImage2D(GLenumtarget, GLint level,

GLintlevel, GLint xoffset,

GLintyoffset, GLint x, GLint y,

GLsizeiwidth, GLsizei height)






        

OpenGL_ES-纹理