为了绘制贴花,我目前使用
另一个我尝试过的方法在这个文件中:"Making Decals"
glPolygonOffset(-1,-1)
,这可以通过欺骗深度缓冲器中的值来消除一些丑陋的z-fighting现象,使得绘制的贴花的多边形看起来更接近于相机。我还以为可以使用不同的参数来使用glPolygonOffset
将贴花相对排序,但这似乎根据摄像机的角度调整,因此当我移动相机时,整个贴花会相互交换顺序。另一个我尝试过的方法在这个文件中:"Making Decals"
这是我的尝试,但我真的不明白如何将其扩展到相对绘制贴花的顺序上,因为贴花是在启用深度缓冲器写入时绘制的,那我不只会得到更多的z fighting吗?
- 禁用深度缓冲器的写入,并渲染A。
- 启用深度缓冲器的写入,并渲染B。
- 再次禁用颜色缓冲器的写入,并渲染A。
- 启用颜色缓冲器的写入。
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
//Render a red solid quad on the color mask
glDepthMask(false);
glColor3f (1.0f, 0.0f, 0.0f);
glBegin (GL_QUADS);
glVertex2f(-1,-1);
glVertex2f(-1,1);
glVertex2f(1,1);
glVertex2f(1,-1);
glEnd ();
//Render the coincident decal, a transparent square works fine for now
glDepthMask(true);
glColor4f(0.0f, 1.0f, 0.0f, 0.5f);
glTranslatef(0, 1, 0.0f);
glScalef(0.5f, 0.5f, 0.5f);
glBegin (GL_QUADS);
glVertex2f(-1,-1);
glVertex2f(-1,1);
glVertex2f(1,1);
glVertex2f(1,-1);
glEnd ();
//Render the red quad again but only on the depth buffer
glColorMask(false, false, false, false);
glLoadIdentity();
glColor3f(1.0f, 0.0f, 0.0f);
glBegin (GL_QUADS);
glVertex2f(-1,-1);
glVertex2f(-1,1);
glVertex2f(1,1);
glVertex2f(1,-1);
glEnd ();
glColorMask(true, true, true, true);
许多游戏中似乎都会这样做,所以我相信有更好的解决方案,但是我已经进行了大量搜索,没有找到任何有关在OpenGL中类似于这样排序贴花的教程。也许我的搜索术语不正确?这个过程还有其他的称呼吗?
glPolygonOffset
应该是“可堆叠”的:请参见例如 http://www.idevgames.com/forums/thread-5474.html。可能是您的 GPU/驱动程序实现有问题。 - dave