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)






        

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值