【问题标题】:Depth occlusion with depth texture OpenGL/GLSL (3.3/330)具有深度纹理 OpenGL/GLSL (3.3/330) 的深度遮挡
【发布时间】:2013-09-06 15:27:19
【问题描述】:

我的世界被分割成一个八叉树(tris 被自动分割),每个卡盘都有自己的索引缓冲区(vbo 是共享的)。我已将 FBO 设置为在一个简单且最少的预通道上写入深度纹理,但我很难想象下一步。

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

另一种方法是使用最终深度纹理进行最终渲染(将其传递给片段着色器),并消除被认为低于从预通道获取的深度纹理中确定的值的片段(早期Z?)。

我可以选择第二种方法,但更愿意关闭块以最小化绘制调用和材质绑定。

我希望有人能对这个问题有所了解,因为我一直在寻找“最好的方法”来做到这一点,但我对这些方法和 FBO 的了解相对有限,我只将 FBO 用于阴影映射灯.

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

编辑:请注意,对于 pre-pass,我只打算渲染一个紧贴的边界框开始。

【问题讨论】:

  • 不太清楚你在问什么。您正在谈论的许多提议的算法实际上都没有意义。例如,如果您有最终的深度缓冲区(又名:您进行了深度预传递),为什么需要片段着色器来“关闭片段......”?这将理所当然地发生,只需再次渲染对象即可。
  • 嗨,Nicol,我想我明白你在说什么。 GFX 卡在片段着色器中插值时会自动关闭未通过深度测试的片段,对吗?如果是这种情况,那我什至不需要做预通行证???但是,我想弄清楚的是从八叉树返回的卡盘的深度遮挡,以防止在最终渲染过程中绑定它们(包括纹理等)。把它想象成一个 BSP 系统,但只有三角形块,并使用深度缓冲区在第二遍之前消除整个块。

标签: c++ opengl glsl


【解决方案1】:

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

我向您推荐的是软件光栅器。
在 CPU 而不是 GPU 上渲染遮挡器/遮挡物。
示例算法:

  1. 将所有遮挡物的 z 值栅格化到缓冲区(例如墙壁)中。
  2. 对于每个被遮挡物(例如家具和其他小物体),通过将其边界框光栅化到同一缓冲区(不写入)来检查遮挡。
  3. 如果在渲染被遮挡物边界框时有未被遮挡的像素,则渲染被遮挡物。

这是一个适用于几乎任何硬件的解决方案。

这里有两个关于 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

英特尔也有演示(也使用软件光栅器)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多