深度纹理深度遮挡OpenGL / GLSL(3.3 / 330)

时间:2013-07-21 12:48:53

标签: c++ opengl glsl

我的世界在八叉树中被分区(tris被自动分割)并且每个chuck都有自己的索引缓冲区(vbo是共享的)。我已经设置了FBO以在简单和最小的预传递上写入深度纹理,但是我很难想象下一步。

我希望从前到后组织平截头体(从八叉树返回)中的块,然后将其渲染到深度纹理。如果没有写入,则可以假设卡盘被隐藏。但是,我不知道在opengl中是否可以进行这样的测试,因为我已经被认为在FBO绑定时你无法读取深度纹理。另外,我不知道如何进行这样的比较测试(可以这样使用FBO吗?)

另一种方法是使用最终渲染的最终深度纹理(将其传递给片段着色器),并忽略被认为是在预先通过的深度纹理中确定的值后面的片段(早期) Z')。

我可以满足于第二种方法,但更愿意解除这些方法以最小化绘制调用和材质绑定。

我希望有人可以对这个问题有所了解,因为我一直在寻找“最好的方法”,但我对这些方法和FBO的了解相对有限,我只使用了FBO来制作阴影贴图灯

很抱歉让人讨厌 - 我知道硬件遮挡测试,但希望实现一个更加通用的深度遮挡系统,不需要“等待”。

编辑:只是一个注意事项,对于预传,我只是要开始一个紧凑的边界框。

1 个答案:

答案 0 :(得分:0)

如果您不是在寻找OpenGL Occlusion Queries,那么您可能需要基于 CPU 的解决方案。

我建议您使用的是软件光栅器 渲染CPU上的遮挡物/遮挡物而不是GPU 示例算法:

  1. 将所有遮挡物的z值栅格化为缓冲区(例如墙壁)。
  2. 对于每个遮挡物(例如家具和其他小物体),通过将其边界框栅格化到同一个缓冲区中来检查遮挡(无需写入)。
  3. 如果在渲染遮挡物边界框时有未被遮挡的像素,则渲染遮挡物。
  4. 这是一个可以在任何硬件上运行的解决方案。

    以下是关于Guerilla如何在Killzone中实现它的两个很棒的演示文稿(在CPU上渲染遮挡物并通过光栅化遮挡物边界框来检查遮挡):
    http://de.slideshare.net/guerrillagames/practical-occlusion-culling-on-ps3
    http://de.slideshare.net/guerrillagames/practical-occlusion-culling-in-killzone-3

    这是Crytek如何做到的(回读并修改前一帧的深度缓冲区并在其上方栅格化遮挡物边界框):
    http://de.slideshare.net/TiagoAlexSousa/secrets-of-cryengine-3-graphics-technology

    以下是关于Umbra 3遮挡剔除的介绍:
    http://de.slideshare.net/Umbra3/visibility-optimization-for-games

    还有intel的演示(也使用软件光栅化器)。

    无论如何:你的问题没有完美的解决方案。你必须自己决定什么最适合你。