3

为了绘制我目前正在使用的glPolygonOffset(-1,-1)贴花,当我通过伪造贴花的 zbuffer 值来绘制贴花时,就好像贴花的多边形更靠近相机一样,这可以消除一些丑陋的 z 战斗伪影。我还认为我可以使用glPolygonOffset各种参数来相对于彼此订购贴花,但这似乎会根据相机角度进行调整,因此当我移动相机时,整个贴花最终会相互交换顺序。

我玩过的另一种方法是在本文档中:“制作贴花”

  1. 禁用深度缓冲区以进行写入,并渲染 A。
  2. 启用深度缓冲区进行写入,并渲染 B。
  3. 禁用用于写入的颜色缓冲区,然后再次渲染 A。
  4. 启用用于写入的颜色缓冲区。

这是我的尝试,但我真的不明白如何扩展它以相对于彼此按顺序绘制贴花,因为贴花是在启用深度缓冲区进行写入时绘制的,我不会得到更多 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 中订购这样的贴花。也许我只是使用了错误的搜索词?这个过程还有别的名字吗?

4

1 回答 1

2

按照您的建议使用glPolygonOffset并从前到后渲染事物可能会比其他选项提供更好的性能,因为它应该充分利用 GPU 中的“早期 Z”优化。

您可能想尝试将更大的数字传递给glPolygonOffset,例如 (-4, -4) 用于第一个贴花, (-8, -8) 用于第二个等 - 这不是一门精确的科学;)

当然,在glPolygonOffset你的贴花变得如此之大之前,你可以以这种方式绘制多少贴花是有限制的,你的贴花会出现在它们不应该出现的东西的前面。

重新相机角度的东西:factor参数glPolygonOffset应该为高角度的多边形添加额外的软糖。

您可以尝试的另一种方法是:

  • 正常渲染所有常规几何体
  • 禁用深度写入(但保持启用深度测试)
  • glPolygonOffset(-1, -1)
  • 从后到前绘制所有贴花

还有另一种可能更有效的方法:

  • 在帧开始时将模板缓冲区清除为 0(同时清除其他缓冲区)
  • 正常渲染所有常规几何体
  • 禁用深度写入(但保持启用深度测试)
  • glPolygonOffset(-1, -1)
  • glStencilFunc(GL_NOTEQUAL, 1, 1),glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE)
  • 从前到后绘制所有贴花
于 2012-06-11T05:42:45.537 回答