标题看起来有点神秘,但我无法在那里真正解释我想做什么,所以我画了一张图来形象化我的问题:
黑色部分是透明的(又名 alpha = 0)。我在帧缓冲区中有蓝色对象(左),我想在其上渲染白色位图(中),使其看起来像合并后的位图(右)。
问题是如果我使用标准的 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
白色对象的整个部分都会显示。我不希望它与帧缓冲区(蓝色)中的内容完全重叠,但只在它具有 alpha 值 > 0(可见)的部分可见。然后它还应该考虑自己的 alpha 值(注意白色对象中的孔)。
glBlendFunc 可以实现类似的功能吗?还是我必须为此编写一个着色器?
PS:我在 http://www.khronos.org/opengles/documentation/opengles1_0/html/glBlendFunc.html 查看了 glBlendFunc 的文档。但我真的没有得到任何帮助。
PPS:我在带有 C++ 的 Android 上使用 OpenGL-ES 2.0,但我认为语言/平台并不是那么重要。
最佳答案
我认为纯粹使用混合函数不可能做到这一点。您希望源像素与源和目标 alpha 相乘,而 blendfunc 只允许其中之一。
然而,使用模板缓冲区可能会得到您想要的结果。我不是这方面的专家,但我认为您可以在绘制背景图像时将模板操作设置为递增,然后在绘制位图时将模板测试设置为拒绝模板 == 0 的位置(仍然启用混合以获得位图的透明区域正确)。您必须查看 glStencilOp
和 glStencilFunc
的 API 才能确定要使用的确切参数。
glBlendFunc 和 glAlphaFunc 的某种组合也有可能,但这取决于它们的求值顺序,所以我不肯定。
关于java - 我可以使用 OpenGL-ES glBlendFunc 来影响混合以将目标考虑在内吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9646972/