如何在 LWJGL 中渲染具有 3D 透明度的 2D 纹理



我一直在尝试在3D世界面前渲染一些纹理作为HUD的一部分。我已经设置了方法,以便我可以轻松地在2D和3D(setPerspective()和setOrtho())之间切换。大多数纹理工作正常,并且按照我想要的方式显示,但是我在使用包含透明度的纹理时遇到了一些困难。纹理的透明部分不会变得透明,而是与背景的颜色相同。

我在某处读到我必须先渲染背景,但是当我这样做时,由于某种原因,HUD 似乎根本没有显示。

public static void render() {
    glClear(GL_COLOR_BUFFER_BIT | GL_BIT_BUFFER_BIT);
    glLoadIdentity();
    glClearColor(0.75f, 1, 1, 0);
    setOrtho();
    //2D Here
    setPerspective();
    //3D Here
}

是的,我的代码中确实有这个;

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

该混合模式与顺序相关。

您正在基于颜色缓冲区中已有的值进行混合,并且可能同时写入深度缓冲区。深度缓冲区不用于对多边形重新排序,只是用于测试它们创建的片段是否应该可见。由于深度测试会导致二元决策(根据已经绘制的内容接受/拒绝),因此在混合半透明多边形时,这确实使生活变得困难。

如果不从后到前对半透明多边形进行排序并首先绘制所有不透明多边形,则半透明多边形最终可能会遮挡内容,而不是正确混合。

这篇关于透明度排序的文章可能会更清楚地解释我刚才所说的内容。

最新更新