Opengl 渲染到纹理:RGB混合是可以的,但A工作起来很奇怪

Opengl 渲染到纹理:RGB混合是可以的,但A工作起来很奇怪,opengl,shader,Opengl,Shader,我使用的是OpenGL4.3 当我需要“正常”混合时,我通常使用GL\u SRC\u ALPHA,GL\u ONE\u减去\u SRC\u ALPHA RGB通道混合得很好,但alpha不是。我希望它是: A = dstA + srcA * (1 - dstA) // Or `A = srcA + dstA * (1 - srcA)`, result is the same. (这是在Paint.NET和其他一些编辑器中混合的工作方式。) 但看起来是这样 A = srcA * srcA + d

我使用的是OpenGL4.3

当我需要“正常”混合时,我通常使用
GL\u SRC\u ALPHA,GL\u ONE\u减去\u SRC\u 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.

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

您需要的是
glBlendFuncSeparate(GL_SRC_ALPHA,GL_ONE_减SRC_ALPHA,GL_ONE减DST_ALPHA,GL_ONE)

对于RGB通道,其方程为
(sC*sA)+(dC*(1-sA))
(“标准”混合),但对于alpha通道,其方程为
(sA*(1-dA))+(dA*1)
,与您想要的方程相匹配

请注意,
glBlendFuncSeparate
是OpenGL 1.4中添加的扩展函数。虽然每台现代电脑都应该支持它,但您无法直接从图书馆访问它


是一个很好的工具,可以将不同的组合可视化为
glBlendFunc[Separate]

您想要的是
glBlendFuncSeparate(GL_SRC_ALPHA,GL_ONE _减去SRC_ALPHA,GL_ONE _减去DST_ALPHA,GL_ONE)

对于RGB通道,其方程为
(sC*sA)+(dC*(1-sA))
(“标准”混合),但对于alpha通道,其方程为
(sA*(1-dA))+(dA*1)
,与您想要的方程相匹配

请注意,
glBlendFuncSeparate
是OpenGL 1.4中添加的扩展函数。虽然每台现代电脑都应该支持它,但您无法直接从图书馆访问它


是一个很好的工具,可以将不同的组合可视化为
glBlendFunc[Separate]

您想要的是
glBlendFuncSeparate(GL_SRC_ALPHA,GL_ONE _减去SRC_ALPHA,GL_ONE _减去DST_ALPHA,GL_ONE)

对于RGB通道,其方程为
(sC*sA)+(dC*(1-sA))
(“标准”混合),但对于alpha通道,其方程为
(sA*(1-dA))+(dA*1)
,与您想要的方程相匹配

请注意,
glBlendFuncSeparate
是OpenGL 1.4中添加的扩展函数。虽然每台现代电脑都应该支持它,但您无法直接从图书馆访问它


是一个很好的工具,可以将不同的组合可视化为
glBlendFunc[Separate]

您想要的是
glBlendFuncSeparate(GL_SRC_ALPHA,GL_ONE _减去SRC_ALPHA,GL_ONE _减去DST_ALPHA,GL_ONE)

对于RGB通道,其方程为
(sC*sA)+(dC*(1-sA))
(“标准”混合),但对于alpha通道,其方程为
(sA*(1-dA))+(dA*1)
,与您想要的方程相匹配

请注意,
glBlendFuncSeparate
是OpenGL 1.4中添加的扩展函数。虽然每台现代电脑都应该支持它,但您无法直接从图书馆访问它

是一个很好的工具,可以将不同的组合可视化到
glBlendFunc[Separate]