1

以下问题:我有两个纹理,我想将这两个组合成一个新的纹理。因此,一个纹理用作背景,另一个将被覆盖。覆盖纹理正在使用 glClearColor(1.0, 1.0, 1.0, 0.0) 进行初始化。对象被绘制到纹理上,这些对象确实具有 alpha 值。

现在在两个纹理之间混合会在对象周围留下一个白色边框。边框来自第二个纹理中的背景颜色是白色的事实,不是吗?

如何在不必考虑叠加纹理的背景颜色的情况下使用 alpha 混合?

4

4 回答 4

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!

于 2011-09-19T14:10:24.377 回答
1

我如何在不必考虑叠加纹理的背景颜色的情况下使用 alpha 混合?

你不能;您的混合功能将背景颜色合并到其中,因为它实际上可能不是“背景”。您将多个对象渲染到纹理,因此“背景”颜色实际上可能是先前渲染的对象。

最好的办法是尽量减少影响。背景颜色没有特别需要是白色的。只是让它变黑。这不会使文物消失;希望它只会让它不那么引人注目。

一个简单的事实是,图形卡的混合根本不是为了能够进行您正在做的那种合成而设计的。当您混合的内容不透明时,它的效果最好。即使在不透明表面和您正在渲染的表面之间存在透明层,它仍然有效。

但是,如果背景实际上是透明的,没有完全不透明的颜色,那么数学就会停止工作。你会得到文物;问题是它们会有多明显。

如果您可以使用更高级的硬件,则可以使用一些基于着色器的程序化混合技术。但是这些都会对性能产生影响。

于 2011-09-16T08:29:19.613 回答
0

确保在绘制透明纹理之前禁用深度写入(因此一个透明纹理不能“阻挡”另一个,从而阻止它的一部分被绘制)。为此,只需调用glDepthMask(false). 完成透明对象的绘制后,调用glDepthMask(true)将深度写入恢复正常。

于 2011-09-19T22:34:43.057 回答
0

正如 Nicol Bolas 指出的那样,尽管我认为使用黑色背景可能会获得更好的结果。但是你应该仔细检查你的混合功能,因为正如你所指出的,这应该没关系......

1.0 * 0.0 + 0.734 * 1.0 = 0.734

我真的不明白为什么你的基础纹理是完全透明的?这是故意的吗?除非您混合纹理然后在其他地方使用它们,否则初始化为 Alpha = 1.0 是一个击球手的想法。

于 2011-09-19T12:52:40.510 回答