1

我将 glBlendFunc 设置为

glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

出于测试目的,我在片段着色器中设置颜色,如下所示

gl_FragColor = vec4(1.0,0.0,0.0,0.0);

对象不应该是完全透明的吗?如果不是,可能是什么原因?

4

1 回答 1

2

的第一个参数glBlendFunc()是源因子,第二个参数是目标因子。在你的情况下:

sfactor = 1.0;
dfactor = 1.0 - src.alpha;

src.alpha = 0.0,从你的gl_FragColor

sfactor = 1.0;
dfactor = 1.0;

所以放入缓冲区的颜色将是:

buffer = sfactor * src + dfactor * dst;

替换...

buffer = (1.0,0.0,0.0,0.0) + dst;

因此,简单地说,您将 1 添加到现有缓冲区的红色通道。

如果要使输出完全透明,通常的功能是:

glBlendFunc(GL_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

您编写的通常用于源中的预乘 alpha。但是 (1, 0, 0, 0) 显然不是一个预乘的 alpha 值!

于 2014-01-12T10:00:15.587 回答