P3D 的纹理透明度

Texture transparency with P3D

我目前正在使用 P3D 编写“毁灭战士”的克隆代码。我没有使用任何外部库。 当我使用蒙版纹理时,我有一个奇怪的伪影。我尝试了几种方法来修复它,但无济于事:(。DISABLE_DEPTH_MASK 抑制了伪影,但后来我的精灵排序全错了。

如果有人能指出我正确的方向,我将不胜感激!我非常接近拥有一个功能引擎! (无视“厄运”脸和士兵精灵,当然,它们只是我使用的临时资产……)

artifact1

如你所见,尽管面具在起作用(见士兵的脚),但它留下了一个巨大的黑色(背景色)工件.

artifact2

当走到四边形后面时,神器还不错,但仍然存在。

你必须 use/enable Blending。 如果您想要渲染不完全不透明但具有部分或完全透明区域的精灵,则使用此技术

场景环境渲染完成后,士兵渲染完成。必须启用深度测试。

在使用 alpha 通道渲染士兵精灵(纹理)之前启用混合。

gl.glEnable(GL.GL_BLEND);
gl.glBlendFunc(GL.GL_SRC_ALPHA,GL.GL_ONE_MINUS_SRC_ALPHA);

并在以下时间后禁用混合:

gl.glDisable(GL.GL_BLEND);

请注意,"black" 士兵精灵的背景必须具有 0.0(完全透明)的 alpha 通道,而士兵本身的 alpha 通道必须为 1.0(完全不透明)。在常见的 PNG 图像中实现了这一点。


说明:

在渲染士兵的时候,背景已经绘制完成,背景颜色(环境颜色)已经存储在framebuffer中。
混合函数为:

dest.rgba = dest.rgba * (1 - src.a) + src.rgba * src.a

其中 dest.rgba 是帧缓冲区中的颜色,src.rgba 是精灵的颜色。

如果精灵的alpha通道为1.0(src.a = 1.0;不透明),则

dest.rgba = dest.rgba * (1.0 - 1.0) + src.rgba * 1.0

dest.rgba = src.rgba

如果精灵的alpha通道为0.0(src.a = 0.0;透明),则

dest.rgba = dest.rgba * (1.0 - 0.0) + src.rgba * 0.0

dest.rgba = dest.rgba