以下问题:我有两个纹理,我想将这两个纹理组合成一个新的纹理。因此,一个纹理用作背景,另一个纹理将被覆盖。使用glClearColor(1.0,1.0,1.0,0.0)初始化叠加纹理。对象被绘制到纹理上,这些对象确实具有alpha值。
现在,在两个纹理之间进行混合会在对象周围留下白色边框。边界来自第二个纹理中的背景颜色是白色的事实,不是吗?
如何在不需要考虑重叠纹理的背景颜色的情况下使用alpha混合?
答案 0 :(得分:5)
我自己解决了这个问题,但非常感谢你们所有人!
问题在于:要结合两种纹理,我使用了glblend(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA),由于OpenGL使用预乘的alpha值,因此无效。与glblend(GL_ONE,GL_ONE_MINUS_SRC_ALPHA)混合,现在作为源术语使用: 1 * * src_alpha src_color!
答案 1 :(得分:1)
如何使用alpha混合,我不必考虑重叠纹理的背景颜色?
你不能;你的混合功能将背景颜色融入其中,因为它实际上可能不是“背景”。您将多个对象渲染到纹理,因此“背景”颜色实际上可能是先前渲染的对象。
最好的办法是尽量减少影响。没有特别需要背景颜色为白色。把它变黑。这不会使文物消失;希望它能让它不那么明显。
简单的事实是,在图形卡中混合并不是为了能够进行你正在进行的那种合成。当你混合的东西是不透明的时候效果最好。即使不透明表面与您渲染的内容之间存在透明层,它仍然有效。
但是如果背景实际上是透明的,没有完全不透明的颜色,那么数学就会停止工作。你会得到文物;问题是他们会有多明显。
如果您可以访问更高级的硬件,则可以使用一些基于着色器的编程混合技术。但这些会对性能产生影响。
答案 2 :(得分:0)
虽然我认为你可能会在黑色背景下获得更好的结果,正如Nicol Bolas指出的那样。但你应该仔细检查你的混合功能,因为正如你所指出的那样,它应该无关紧要......
1.0 * 0.0 + 0.734 * 1.0 = 0.734
我真正没有得到的是为什么你的基础纹理是完全透明的?这是有意的吗?除非你混合纹理然后在其他地方使用它们,否则初始化为Alpha = 1.0是一个重要的想法。
答案 3 :(得分:0)
确保在绘制透明纹理之前禁用深度书写(因此一个透明纹理不能“阻挡”另一个透明纹理,从而阻止部分透明纹理被绘制)。为此,请致电glDepthMask(false)
。完成绘制透明对象后,请调用glDepthMask(true)
将深度写入设置为正常。