0

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

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

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

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

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

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

编辑:请注意,对于预通行证,我只打算渲染一个紧贴的边界框开始。

4

1 回答 1

0

如果您不是在寻找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

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

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

于 2013-09-06T07:27:19.973 回答