opengles2.0中的纹理

opengles2.0纹理:
    就支持两种纹理,GL_TEXTURE_2D,GL_TEXTURE_CUBE_MAP


立方体纹理:
   立方体纹理像素使用(s,t,r)来寻找像素,具体参见其他写shader的书籍。   


只支持下面这几种格式:
    GL_RGB,
    GL_RGBA,
    GL_LUMINANCE,
   GL_LUMINANCE_ALPHA,
   GL_ALPHA
像素的数据类型,就是RGB中的一个R的数据类型,就是图像的每个通道的数据类型:
   GL_UNSIGNED_BYTE,
   GL_UNSIGNED_SHORT_4_4_4_4,
   GL_UNSIGNED_SHORT_5_5_5_1,
   GL_UNSIGNED_SHORT_5_6_5
指定纹理显示在上传到显卡的过程中,每一行像素的内存对齐方式:
   glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 这个表示按1字节对齐。默认情况是4字节对齐。
这个函数第一个参数的可取两个值,另外一个是:GL_PACK_ALIGNMENT。用于:
   glReadPixels读取纹理像素到内存。


纹理的插值方式,也就是放大缩小的计算方式,还有wrap的模式:

   glTexParameteri(GLenum target,GLenum pname, GLint param)
      target:
         2D和立方体纹理
      pname:
         指定放大缩小还是wrap
      param:
         对于放大有两个值可选:
            GL_NEAREST,GL_LINEAR
         对于缩小可选六个值:
            GL_NEAREST,GL_LINEAR
            GL_NEAREST_MIPMAP_NEAREST,
            GL_NEAREST_MIPMAP_LINEAR
            GL_LINEAR_MIPMAP_LINEAR,
            GL_LINEAR_MIPMAP_NEAREST.
        对于wrap模式:
            GL_REPEAT,
            GL_CLAMP_TO_EDGE,
            GL_MIRRORED_REPEAT.


为纹理自动生成mipmap:
    void glGenerateMipmap(GLenum target);自动为所有2D或立方体纹理生成mipmap纹理。
    纹理坐标的格式:左下角(0,0),右上角(1,1)




shader中使用纹理:

    先将纹理绑定到一个纹理单元,然后指定sampler2D去采样这个纹理,怎么指定呢?
   这样来指定:如果纹理是GL_TEXTURE0,就给sampler2D赋值为0,以此类推。

   这样sampler2D就会去采样这个纹理单元绑定的纹理。


   怎样绑定纹理到一个纹理单元:
   调用函数:glActiveTexture(GL_TEXTURE0);
   然后:glBindTexture(GL_TEXTURE2D,texid);


   最后设置sampler2D的值:
   glUniform1i(samplerLoc,0);

   最后在shader里面调用vec4 texture2D(sampler,vec2)就能得到某点的像素了。
   注意哦,这个返回的是vec4,也就是无论你的纹理像素是什么格式的,都返回vec4类型:

   GL_RGB (R,G,B,1.0)
   GL_RGBA (R,G,B,A)
   GL_LUMINANCE (L,L,L,1.0)
   GL_LUMINANCE_ALPHA (L,L,L,A)
   GL_ALPHA (0.0, 0.0, 0.0, A)


使用立方体纹理:

   1 glGenTexture(1, &textureid);
   2 glBindTexture(GL_TEXTURE_CUBE_MAP,textureid);
   3 上传图像:
   glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGB, 1, 1,
      0, GL_RGB, GL_UNSIGNED_BYTE, data);

   依次上传其他五张图片即可。
   4 设置过滤模式,wrap模式即可。


在shader里面访问立方体纹理使用函数:


   vec4 textureCube(samplerCube sampler,vec3 coord [,float bias]);




压缩纹理:
opengl es 2.0 官方标准里面并没有定义任何压缩纹理格式,他只负责上传压缩纹理
纹理格式有显卡硬件厂商通过扩展来定义
ETC格式就是一种被广泛厂商支持的一种格式GL_OES_compressed_ETC1_RGB8_texture:
void glCompressedTexImage2D(target, level(mipmap), (由厂商指定的格式),width,height,0,
整张纹理的字节数,纹理数据指针);

glGetIntegerv(GL_NUM_COMPRESSED_TEXTURE_FORMATS);//返回支持几种压缩纹理格式
glGetIntegerv(GL_COMPRESSED_TEXTURE_FORMATS); //返回支持的压缩纹理格式


纹理的更新:

可以只更新部分纹理:void glTexSubImage2D(target, level,xoffset,yoffset,width,height,
GL_RGB,GL_UNSIGNED_BYTE,pixels);


void glCompressedTexSubImage2D(target,level,xoffset,yoffset,width,height,
厂商给的格式, 要更新的字节数,pixels);


将颜色缓存中的像素复制到纹理(注意渲染到纹理比这种机制要快):


只能从back buffer复制!!


如果当前是渲染到pbuffer的,那么会从这个pbuffer复制。
   
  void glCopyTexImage2D(target,level,GL_RGB,x,y,width,height,0);
      x,y,width,height都是指的复制源。


  void glCopyTexSubImage2D(target, level, xoffset,yoffset,x,y,width,height);

      xoffset,yoffset,值的目的纹理的位置,
      x,y,width,height,值的复制源。


opengl es2.0还允许厂商自己做一些扩展,比如支持3D纹理,浮点纹理等。


纹理尺寸非2的n次方支持:GL_OES_texture_npot

opengl es2.0本身支持这个,但是使用方面有些限制,比如纹理wrap只能为
clamp_to_edge,min filter 只能有两种,也就是不能有mipmap。
如果有了GL_OES_texture_npot,就没有这些限制了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值