OpenGL渲染到纹理透明度问题
Posted
技术标签:
【中文标题】OpenGL渲染到纹理透明度问题【英文标题】:OpenGL Render To Texture Transparency Problem 【发布时间】:2011-01-20 17:39:40 【问题描述】:我构建了一个“后处理管道”,它收集渲染调用并将它们放入纹理中。渲染完所有后处理效果后,我将所有结果放在一起。这是我的问题:
一开始,我使用 glClearColor(0,0,0,0) 清除缓冲区。然后我调用绘图调用。当对象具有 0.5 alpha 的纹理时出现。这导致背景颜色和纹理之间的混合。我想避免混合。例如,如果纹理的像素为 0.5、0.5、0.5、0.5,则结果为 0.25、0.25、0.25、0.5,因为透明度为零的黑色背景受到影响。
我使用 glCopyTexImage2D 函数将渲染结果放入纹理中。我阅读了有关使用帧缓冲区的文章,但我想确定是否可以解决使用多个帧缓冲区的问题。
有人对我有什么建议吗?
【问题讨论】:
【参考方案1】:您可以尝试在绘图时使用预乘 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 中有一个很好的解释。
【讨论】:
感谢您的回答。我今晚或明天检查并给你结果。以上是关于OpenGL渲染到纹理透明度问题的主要内容,如果未能解决你的问题,请参考以下文章