如何在OpenGL ES 1.1中进行不规则形状裁剪?

时间:2009-08-18 06:49:34

标签: opengl-es

如果我有一个不规则形状的物体的纹理,并且想要限制另一个纹理(即任何类型的彩色图像)的绘制仅限于第一个纹理中对象的形状,我怎样才能实现这个效果OpenGL ES 1.1?这就像第一个纹理的形状就像裁剪区一样。

我一直试图通过使用帧缓冲区来绘制第一个纹理并通过使用opengl逻辑运算来尝试将绘图仅限制为非透明像素,然后将下一个纹理渲染到帧缓冲区以获取结果。但是,没有成功。

有没有人这样做过?

2 个答案:

答案 0 :(得分:0)

如果使用逻辑运算,则无需渲染到纹理。只需使用模板印刷 - 即将第一个形状绘制到模板缓冲区中(仅限),然后使用模板测试消除蒙板像素。

(本教程适用于桌面窗口GL,但我认为模板逻辑如下。)

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=26

如果你想使用纹理,我建议将第一个形状渲染到纹理的 alpha通道中(通过OES_framebuffer或使用glCopyTexImage2D。

然后使用glTexEnv和'combine'将真实纹理或颜色的alpha通道乘以蒙版纹理。这将有效地“切除”大部分像素。 (如果您不希望屏蔽像素写入Z缓冲区,请使用深度测试)

以纹理为中心的方法有一个难看的复杂性:您需要通过使用组合的模型视图和投影矩阵作为纹理矩阵在屏幕空间中生成纹理坐标,然后将顶点馈送到glTexCoordPointer中。对于1.1硬件来说,这是一个“穷人的glTexGen”。

在这两种方法之间,我建议尽可能地进行模板印刷。模板缓冲区的可用性可能取决于您的特定窗口管理器。

答案 1 :(得分:0)

使用多重纹理并通过另一个(alpha)调制一个纹理或将一个纹理渲染到模板缓冲区然后对其进行测试,在后一种情况下,您需要使用alpha然后进行alpha测试。在任何一种情况下,您的纹理都必须具有纹理单元的alpha输出形状,因此多纹理调制将是您认为最快的选项。