渲染到纹理:RGB混合是好的,但A很奇怪

时间:2014-10-02 14:52:17

标签: opengl shader

我使用的是OpenGL 4.3。

当我需要“正常”混合时,我通常会使用GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA RGB通道混合得很好,但alpha不是。我希望它是:

A = dstA + srcA * (1 - dstA)
// Or `A = srcA + dstA * (1 - srcA)`, result is the same.

(这是Paint.NET和其他一些编辑器的混合工作方式。)
但看起来好像是

A = srcA * srcA + dstA * (1 - srcA)
// Or `A = srcA`, I'm not sure.

我可以以某种方式达到预期的效果吗?也许,在着色器中使用不同的混合函数或修改颜色值?

1 个答案:

答案 0 :(得分:3)

你想要的是glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA, GL_ONE);

这对于RGB通道具有等式(sC*sA) + (dC*(1-sA))("标准"混合),但对于Alpha通道具有(sA*(1-dA)) + (dA*1),它与您想要的等式匹配。

请注意glBlendFuncSeparate是OpenGL 1.4中添加的扩展功能。虽然每台现代PC都应该支持它,但您无法直接从库中访问它。

http://www.andersriggelsen.dk/glblendfunc.php是将glBlendFunc[Separate]的不同组合可视化的好工具。