OpenGL_ES-纹理

来源:互联网 发布:解除绑定mac地址 编辑:程序博客网 时间:2024/06/05 09:37


                                            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)






        

0 0