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

OpenGL_ES-纹理

2015-06-08 22:53 330 查看

                                            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)

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