1

我一直在尝试将一些纹理渲染为 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)
4

1 回答 1

0

该混合模式取决于顺序。

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

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

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

于 2013-09-08T06:41:15.297 回答