OpenGL渲染纹理透明度问题

时间:2011-01-20 17:39:40

标签: c++ windows opengl graphics glew

我构建了一个“后处理管道”,它收集rendercall并将它们放入纹理中。在渲染所有后处理效果后,我将所有结果放在一起。这是我的问题:

开始时,我用glClearColor(0,0,0,0)清除缓冲区。然后我调用绘制调用。当一个物体具有0.5 alpha的纹理时。这导致backgroundcolor和纹理之间的混合。我想避免混合。例如,如果纹理的像素为0.5,0.5,0.5,0.5,则结果为0.25,0.25,0.25,0.5,因为透明度为零的黑色背景会受到影响。

我使用glCopyTexImage2D函数将我的渲染结果放入纹理中。我读过有关使用帧缓冲的文章,但我想确定是否可以使用多个帧缓冲区来解决我的问题。

有人对我有建议吗?

1 个答案:

答案 0 :(得分:2)

您可以在绘图时尝试使用预乘alpha。基本上,确保所有颜色值已经乘以alpha值。然后,而不是

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

你会用

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

纹理的像素将为0.25,0.25,0.25,0.5。结果将是0.25,0.25,0.25,0.5,因为这都是乘以1.当然,您必须确保将得到的输出纹理再次正确解释为具有预乘alpha。

维基百科的dusty corner有一个很好的解释。