【发布时间】:2015-06-09 04:19:22
【问题描述】:
在使用 OpenGL ES 2.0 的 2D 台球游戏中,当“白色”和“数字”纹理围绕球的边缘旋转时,我需要对其进行遮罩。我目前正在使用模板,但有两个问题:
- 模板测试中没有抗锯齿,产生锯齿状边缘。
- 每个球都被单独屏蔽(相邻的球可能会相互渗透),而且每帧多次清除和重新创建模板缓冲区太慢了。
我很确定最好的解决方案将涉及着色器代码,但我是着色器编程的新手(对 OpenGL 本身也很陌生),我在研究中发现的大量结果让我不确定如何最好地继续。
特别是第一个回答“Alpha 蒙版纹理”的方法,使用灰度图像作为最终gl_FragColor 的alpha 值。但是我找不到任何关于如何设置这样的着色器程序的示例。 (常见的例子有 3 张图片,分别是背景、前景和蒙版,并使用 mix() 将它们混合)。
例如,蒙版是整个球的大小和形状,但是像数字这样的纹理是在球的一部分上绘制的(并且对于透视图使用不同的变换矩阵),所以纹理坐标是图像和蒙版完全不同。我找不到类似的东西。
第二种可能更容易的选择是仅对距中心一定距离^2 以外的像素使用“丢弃”。甚至可以羽化阿尔法。我发现了这种方法: https://gist.github.com/tgfrerer/6009069
...但是它使用了 ES 2.0 中没有的功能。如果有人可以提供一个功能相似但适用于 ES 的示例,那也将受到欢迎。就像对比两种方法的优点一样。
【问题讨论】:
标签: opengl-es opengl-es-2.0 mask