P3D的纹理透明度

时间:2018-06-02 15:52:49

标签: opengl processing blending

我正在使用P3D编写“Doom”克隆。我没有使用任何外部库。 当我使用蒙版纹理时,我会遇到一个奇怪的神器。我已经尝试了几种方法来修复它,但无济于事:(。DISABLE_DEPTH_MASK会抑制这个工件,但是我的精灵会被排序错误。

如果有人能指出我正确的方向,我真的很感激!我非常接近拥有功能引擎! (无视“厄运”面孔和士兵精灵,当然,它们只是我正在使用的临时资产......)

artifact1
artifact1你可以看到,虽然面具正在工作(看到士兵的脚)但它背后留下了一个巨大的黑色(背景色)神器。

artifact2
artifact2
当走在四边形后面时,神器不是太糟糕但仍然存在。

1 个答案:

答案 0 :(得分:1)

您必须使用/启用Blending。 如果你想要渲染一个非完全不透明但有部分或完全透明区域的精灵,可以使用这种技术

在场景环境结束后,士兵最终会被渲染。必须启用深度测试。

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

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

并在以下后禁用混合:

gl.glDisable(GL.GL_BLEND);

注意,士兵精灵的“黑色”背景必须具有0.0(完全透明)的alpha通道,并且士兵本身的alpha通道必须为1.0(完全不透明)。通常,PNG图像可实现此目的。


说明:

在渲染士兵时,已经绘制了背景并且背景颜色(环境的颜色)已存储在帧缓冲区中。
混合功能是:

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