陈江川

邮箱:jiangchuanc@gmail.com

OpenGL ES 第三章

OpenGL ES中的内容和Demo均出自《OpenGL+ES应用开发实践指南:iOS卷》,Demo中我做了很详细的注释。

纹理

纹理是一个用来保存图像的颜色元素值的OpenGL ES缓存。当纹理应用到几何图形中后,会使渲染的场景显得更自然。

当用一个图像初始化一个纹理缓存之后,在这个图像中的每个像素变成了纹理中的一个纹素(texel)。与像素类型,纹素保存颜色数据。

纹理坐标系有一个命名为S和T的2D轴,在一个纹理中无论有多少个纹素,纹理的尺寸永远在S轴上从0.0到1.0,在T轴上从0.0到1.0。

对齐纹理和几何图形

我们需要告诉OpenGL ES如何使用一个纹理来给几何图形对象着色。在渲染时,GPU会转换OpenGL ES坐标系为帧缓存中对应的真实像素位置。帧缓存中的像素位子叫做视口(viewport)

转换为视口坐标的结果是所有绘制的几何图形都被拉伸以适合屏幕大小,也就是说高比宽大了。在每个顶点的X、Y、Z坐标被转换成视口坐标后,GPU会设置转换生成三角形内的每个像素的颜色。

转换几何形态数据为帧缓存中的颜色像素的渲染步骤叫做点阵化(rasterizing),每个颜色像素叫做片元(fragment)


程序需要指定怎么对齐纹理和顶点,以便让GPU知道每个片元的颜色由哪些纹素决定,这个对齐又叫做映射(mapping)。映射(mapping)是通过扩展为每个顶点保存的数据来实现的。
除了X/Y/Z坐标,每个顶点还给出了U和V坐标值。每个U坐标会映射顶点在视口中的最终位置到纹理中的沿着S轴的一个位置,V坐标映射到T轴。

纹理的取样模式

取样(Sampling):每个顶点的U和V坐标会附加到每个顶点在视口坐标中的最终位置,然后GPU会根据计算出来的每个片元的U、V位置从绑定的纹理中选择纹素。取样会把纹理的S和T坐标系与每个渲染的三角形的顶点的U、V坐标匹配起来。
渲染过程中的取样可能会导致纹理被拉伸、压缩、甚至翻转。

OpenGL ES支持多个不同的取样模式。程序会使用如下的glTexParameteri()函数来配置每个绑定的纹理,以便使OpenGL ES知道怎么处理可用纹素的数量与需要被着色的片元的数量之间的不匹配。

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

除了减小和放大过滤选项,当U、V坐标的值小于0或者`大于1时,程序会指定要发生什么。有两种选者:1)尽可能多地重复纹理以填满映射到几何图形的整个U、V区域;2)每片元的U、V坐标的值超出纹理的S、T坐标系的范围时,取样纹理边缘的纹素。

纹理的循环模式是S和T分别设置的:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

03-纹理的基本使用

04-修改纹理的取样模式

« 直播/视频监控那点事 OpenGL ES 第二章 »