陈江川

邮箱:jiangchuanc@gmail.com

OpenGL ES 06-多重纹理

很多有用的可视效果可以通过把片元颜色与在像素渲染缓存中现存的颜色相混合来实现,但是这个技术有两个主要的缺点:每次显示可更新时几何图形必须要被渲染一到更多次,混合函数需要从像素颜色渲染缓存读取颜色数据以便与片元颜色混合。然后结果被写回帧缓存。当带有透明度数据的多个纹理层叠时,每个纹理的像素颜色渲染缓存的颜色被再次读取、混合、重写。

通过多次读写像素颜色渲染缓存来创建以个最终的渲染像素的过程叫多通道渲染。但是内存访问限制了性能,因此多通道渲染是次优的。

下面介绍的多重纹理方法避免了多通道渲染的大部分缺陷。
所有的现在GPU都能够同时从至少两个纹理缓存中取样纹理。GLKit的GLKBaseEffect类同时支持两种纹理。执行纹素取样和混合的硬件组件叫做一个纹理单元或者一个取样器。如果你的应用需要超过两个纹理单元,在确定一个单独的通道中可以结合多少个纹理之前,请使用下面的代码:

GLint iUnits;
glGetIntegerv(GL_MAX_TEXTURE_UNITS, &iUnits);

本例子的Demo产生的输出与05-混合片元颜色相同,除了树叶和虫子纹理被混合在了一个通道中,而且与像素颜色渲染缓存的内容混合产生结果片元颜色的过程只会在每次显示更新中发生一次。

多重纹理的配置

多重纹理引入了另一个组合配置选项。iOS中的GLKit的GLKEffectPropertyTexture类操作了3种常见的多重纹理模式:GLKTextureEnvModeReplace、GLKTextureEnvModeModulate以及GLKTextureEnvModeDecal。

默认使用GLKTextureEnvModeModulate模式,这种模式几乎总是产生最好的结果。它会让所有的为灯光和其他效果计算出来的颜色与从一个纹理取样的颜色相混合。

« native和JavaScript之间的通信 OpenGL ES 05-混合片元颜色 »