【发布时间】:2015-04-30 15:51:11
【问题描述】:
我清除了一个帧缓冲区...
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);
...我启用了这样的混合...
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
[self render]
glDisable(GL_BLEND);
在那个渲染代码中,我只是添加了一个四边形并绘制它。在我的片段着色器中,我有...
gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
这会产生一个清晰的四边形。伟大的。没有颜色,没有 alpha,什么都没有……明白了。但是,我将片段着色器更改为...
gl_FragColor = vec4(1.0, 0.0, 0.0, 0.0);
我得到了填充白色的四边形。有人可以向我解释一下如何用完全透明的红色填充四边形会产生不透明的白色,而不仅仅是透明的吗?
【问题讨论】:
-
你在使用深度缓冲/深度测试吗?
-
好吧,您将
GL_ONE作为glBlendFunc()的第一个参数。因此,您将片段颜色添加到目标值,与 alpha 值无关。 -
@RetoKoradi 正确,因此片段颜色为 (1, 0, 0, 0),目标颜色为 (0, 0, 0, 0)。将它们加在一起得到 (1, 0, 0, 0),对吗?为什么 (1, 0, 0, 0) 的最终值呈现为白色?在我看来应该很清楚,因为 alpha 值为 0,或者至少是某种红色?
-
@AyanSengupta 我实际上禁用了深度测试。这是个问题吗?
-
是的,你会认为它是红色的。