【问题标题】:Hierachical Z-Buffering for occlusion culling用于遮挡剔除的分层 Z 缓冲
【发布时间】:2015-11-29 15:53:45
【问题描述】:

我正在阅读实时渲染第三版中的遮挡剔除部分,但我不明白它是如何工作的。一些问题:

  1. “Z 形金字塔”有何贡献?为什么我们需要 Z 缓冲区的多个分辨率?书中显示如下(左侧):

  2. 八叉树结构是否与用于一般截锥体剔除和渲染的八叉树结构相同?还是专门为遮挡剔除技术制作的八叉树?

  3. 一个更一般的问题:在上一节(以及here)中,遮挡查询术语被描述为“渲染对象的简化边界体积并将其深度结果与 Z 缓冲区进行比较,返回可见的像素数量。” OpenGL 中的哪些函数与此遮挡查询概念相关联?

  4. 这种技术是开放世界游戏遮挡剔除的标准吗?

【问题讨论】:

  • 也可以在gamedev.stackexchange.com 上提问。
  • 在不同的论坛问同样的问题不是不道德吗?
  • 我不这么认为。
  • 关于分层z-金字塔的一面,只是从广义的概念层面(我自己从未实现过遮挡剔除),这种深度缓冲区表示的好处是早期拒绝。假设您渲染了一个覆盖整个视口的平面。它不必垂直,但假设它的最大深度为 0.5。在这种情况下,您实际上可以在此层次结构的根部存储一个 1 像素的 Z-Buffer,其值为 0.5。现在,任何时候您绘制任何对象,只要查看这个单像素缓冲区并看到没有...
  • ... 对象的深度将小于0.5(例如:通过投影其 AABB 并检查最远点)。这也意味着你可以在这个深度层次结构的上层获得更多的时间局部性,这只需要少量的像素条目。它更多地涉及与着色器交互的方式,但这将是深度缓冲区层次结构的广泛概念原因。

标签: opengl graphics occlusion-culling


【解决方案1】:
  1. 分层 Z 缓冲区在较大的附近对象可能会遮挡许多较小的较远对象的情况下很有用。例如,渲染建筑物内部或山区景观。

    当附近的对象被渲染时,它会将 Z 缓冲区金字塔的较低分辨率级别上的某个像素设置为接近深度值。当渲染一个更小的对象时,可以首先检查其边界框与该像素并进行整体剔除。

  2. 是的。这是相同的八叉树。但它不一定是八叉树。任何分层空间索引数据结构都适用于分层 Z 缓冲区或平截头体剔除。

    为了从分层 Z 缓冲区中受益,我们需要从最近的对象开始渲染风景。可以使用八叉树或 BSP 等技术。

    此外,手头有一个八叉树可以让我们根据到它们的 bbox 的距离而不是单独的对象或三角形来剔除整个树枝。

  3. OpenGL 中负责遮挡查询的部分是:glBeginQueryglEndQueryglGetQueryObject。详情请见Query Objects

  4. 分层 Z 缓冲区在 hardware on some early Radeons 中实现。但是我没有听说现在使用它。

    另一方面,通常使用遮挡查询。从本质上讲,它们提供了类似的好处。

【讨论】:

    猜你喜欢
    • 2011-06-27
    • 2014-09-22
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多