java - 我可以使用 OpenGL-ES glBlendFunc 来影响混合以将目标考虑在内吗?

标签 java android c++ opengl-es

标题看起来有点神秘,但我无法在那里真正解释我想做什么,所以我画了一张图来形象化我的问题:

enter image description here

黑色部分是透明的(又名 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 的位置(仍然启用混合以获得位图的透明区域正确)。您必须查看 glStencilOpglStencilFunc 的 API 才能确定要使用的确切参数。

glBlendFunc 和 glAlphaFunc 的某种组合也有可能,但这取决于它们的求值顺序,所以我不肯定。

关于java - 我可以使用 OpenGL-ES glBlendFunc 来影响混合以将目标考虑在内吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9646972/

相关文章:

Java Hashmap 两个相同的对象分开存储

java - 如何用新的散点更新绘图区域?

android - 如何在 android 中使用 Google Analytics 跟踪 webview 内容?

android - 使用 Intent 从 Activity 启动 fragmentActivity

android - 当用户从浏览器下载文件时,如何启动我的应用程序?

c++ - Eclipse CDT 自定义编译器错误解析插件

java - 如何在外部组件上发生事件时立即检测到该事件。不想投票,还有其他选择吗?

java - 比较非英文字符

c++ - Windows 中套接字发送缓冲区的大小是多少?

c++ - 有没有办法以 vector 形式访问内存映射?