我一直试图渲染一些纹理作为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)
发布于 2013-09-07 22:41:15
这种混合模式依赖于秩序。
您正在基于颜色缓冲区中已经存在的值进行混合,并且可能同时写入深度缓冲区。深度缓冲区不用于重新排序您的多边形,只是为了测试它们创建的片段是否应该是可见的。由于深度测试的结果是二进制决定(根据已经绘制的内容接受/拒绝),因此当需要混合半透明多边形时,这确实会使生活变得困难。
如果你不排序你的半透明多边形从后面到前面,并绘制所有不透明的多边形,那么你的半透明多边形可以结束封闭性的东西,而不是适当的混合。
这篇关于透明排序的文章可能会更清楚地解释我刚才说的话。
https://stackoverflow.com/questions/18680976
复制相似问题