如何渲染部分透明的纹理?


13

早安StackOverflow,我现在遇到了一个问题,因为我似乎找不到使用openGL透明渲染纹理的一部分的方法。

这是我的设置:我有一个四边形,代表一堵墙,上面覆盖了此纹理(已转换为PNG以进行上传)。显然,除了玻璃板之外,我希望墙是不透明的。墙后还有另一架飞机应该显示风景。我想从窗户后面看风景。每个纹理都是带有Alpha通道的TGA。

首先渲染“风景”,然后渲染墙。我认为足以达到这种效果,但事实并非如此。窗口应该是透明的部分是黑色的,只有当我经过墙壁时才会出现风景。

启用该功能后,我尝试使用GLBlendFunc()摆弄,但似乎无法解决问题。

我是否忘记了重要的一步?

谢谢 :)


您好,欢迎来到gdse。我进行了很少的编辑,我们不喜欢将标签放入标题太多的问题中(尤其是当您在标签中使用相同的标签时:)。和你的问题。您是使用固定管线还是自己的着色器?
Notabene 2011年

感谢您的修改。我不确定“固定管线”的含义,但是我确实手动构建每个顶点,并且不使用任何着色器。如果那很重要,那么我不会使用openGL的最新版本,因为它是用于学校作业的(我认为它是openGL 3)。
megamoustache 2011年

如果您可以将图片包含在问题中,那将是很好的。它似乎已从其原始位置消失了。
或Mapper

Answers:


19

除了您已经说过的所有内容(带有Alpha通道的纹理,在绘制墙和窗口之前绘制景观)之外,您还需要做两件事。

首先,您需要启用OpenGL的混合功能:

glEnable(GL_BLEND);

其次,您需要告诉OpenGL如何计算混合像素的颜色(顺便说一下,OpenGL称其为“碎片”)。在这种情况下,您可以使用以下简单的方法:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

启用混合后,OpenGL将根据您在glBlendFunc中提供的功能参数来合并像素颜色。具体来说,它将执行“ source.color * source.alpha + destination.color *(1-source.alpha)”,其中“ source”是您当前正在渲染的纹理,“ destination”是已存在的颜色帧缓冲区(横向)。因此,无论您的Alpha通道是白色的什么地方,您都将获得墙壁的颜色;而无论Alpha通道是黑色的任何地方,您都将获得风景的颜色。如果Alpha通道为灰色,则两种颜色之间会有些淡化。

如果您的窗口是完全透明的,那么还有其他方法可以做到,绘制两个多边形的顺序并不重要,但是这开始涉及更高级的概念,例如Alpha阈值。您当前的情况可能不需要。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.