我使用的是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.
我可以以某种方式达到预期的效果吗?也许,在着色器中使用不同的混合函数或修改颜色值?
答案 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]
的不同组合可视化的好工具。