【发布时间】:2012-06-11 13:42:45
【问题描述】:
为了绘制贴花,我目前正在使用glPolygonOffset(-1,-1),当我通过伪造贴花的 zbuffer 值来绘制贴花时,这让我摆脱了一些丑陋的 z-fighting 工件,就好像贴花的多边形是离相机更近。我还认为我可以使用 glPolygonOffset 和各种参数来相对于彼此订购贴花,但这似乎会根据相机角度进行调整,因此当我移动相机时,整个贴花最终会相互交换顺序周围。
我使用过的另一种方法在本文档中:"Making Decals"
- 禁用深度缓冲区以进行写入,然后渲染 A。
- 为写入启用深度缓冲区,并渲染 B。
- 禁用用于写入的颜色缓冲区,然后重新渲染 A。
- 启用颜色缓冲区以进行写入。
这是我的尝试,但我真的不明白如何扩展它以相对于彼此按顺序绘制贴花,因为贴花是在启用深度缓冲区以进行写入时绘制的,我不只是获得更多的 z 战斗?
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 中订购这样的贴花。也许我只是使用了错误的搜索词?这个过程还有别的名字吗?
【问题讨论】: