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,就没有这些限制了。