我一直在尝试将一些纹理渲染为 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)
最佳答案
该混合模式取决于顺序。
您正在根据颜色缓冲区中已有的值进行混合,并可能同时写入深度缓冲区。深度缓冲区不用于重新排序多边形,只是为了测试它们创建的片段是否可见。由于深度测试会产生二元决策(根据已绘制的内容接受/拒绝),因此在混合半透明多边形时,这确实会让事情变得困难。
如果您不从后到前对半透明多边形进行排序并首先绘制所有不透明多边形,那么您的半透明多边形可能会遮挡物体而不是正确混合。
这篇文章关于Transparency Sorting可能会更清楚地解释我刚才所说的内容。
关于java - 如何在 LWJGL 中在 3D 上渲染具有透明度的 2D 纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18680976/