Cg 着色器 Alpha 混合

Cg Shaders Alpha Blending

我想使用 Alpha Blending (SRC_ALPHA, ONE_MINUS_SRC_ALPHA),基本上是这样的:

frag_out.aaaa * frag.out + ((1.0, 1.0, 1.0, 1.0) - frag_out.aaaa) * pixel_color

假设屏幕上已有的像素颜色是 (1.0, 1.0, 1.0, 1.0) 我目前渲染的颜色是(1.0, 1.0, 1.0, 0.4)

当我渲染它时,屏幕上的结果颜色具有 alpha 0.76(即使它之前是完全不透明的)

确实:

(0.4, 0.4, 0.4, 0.4) * (1.0, 1.0, 1.0, 0.4) + (0.6, 0.6, 0.6, 0.6) * (1.0, 1.0, 1.0, 1.0) = (1.0, 1.0, 1.0, 0.76)

所以屏幕上的颜色基本上是不透明的(白色),在我将透明精灵放在顶部后屏幕变得透明(0.76 alpha)并且我能够透过背景看。如果我能这样混合就完美了:

(0.4, 0.4, 0.4, 1.0) * (1.0, 1.0, 1.0, 0.4) + (0.6, 0.6, 0.6, 0.6) * (1.0, 1.0, 1.0, 1.0) = (1.0, 1.0, 1.0, 1.0)

有可能实现吗?如果是,如何?

这在使用 OpenGL 3.0 及更高版本时完全可行,因为可以为 RGB 和 A 单独设置混合函数。对于您的情况,这将是

glBlendFuncSeparate(GL_SOURCE_ALPHA, GL_ONE_MINUS_SOURCE_ALPHA, GL_ONE, GL_ONE);

指定目标 alpha 混合因子的最后一个参数可能需要调整,因为您没有指定目标 alpha < 1 的行为。有关详细信息,请查看 function documentation