我是不是错误地渲染了 BSP 树?

Posted

技术标签:

【中文标题】我是不是错误地渲染了 BSP 树?【英文标题】:Am I rendering BSP trees incorrectly?我是否错误地渲染了 BSP 树? 【发布时间】:2012-02-11 03:54:52 【问题描述】:

我有一个 BSP 树加载到内存中。我首先找出我所在的叶子。接下来,我对 PVS 进行解码。然后,我遍历那个 PVS 中的每个区域,看看它是否在我的视锥体中。

有人告诉我这是不正确的渲染方式,我实际上应该通过遍历 BSP 树来进行从后到前的渲染。我该怎么做?我已经看到了许多不同的方法来做到这一点,这就是我问的原因。

例如,Quake 3 BSP 渲染显示: 遍历 BSP 以确定相机位于哪个叶子中。 检索并解压此叶子的 PVS,遍历 PVS 并在 BSP 中标记叶子。 从近到远遍历 BSP 如果一个节点没有被标记,跳过它。 针对相机视锥体测试节点边界框​​。 将当前叶子添加到再现列表中

这是否仍然是今天的标准方式,或者至少对于更简单的游戏而言。

【问题讨论】:

从前到后是当今首选的渲染方式; back to front 仅对画家算法是必需的(即在压缩之前,高带宽 z 缓冲区使它们更可取)。从前到后允许早期的 z 拒绝(在现代硬件中,在完成确定和检查其 z 值之外的许多工作之前,您绘制的所有内容都将被拒绝)。当我得到更多时,我会再次发表评论。 【参考方案1】:

正如 OrgnlDave 所说:

当你绘制一个图元时,位于 z-buffer 前面的像素将被绘制并且程序着色器将被执行。但如果像素在场景后面,则像素将被拒绝。没有义务从前到后进行这样的绘制,但性能上的提升是最糟糕的。

但是,如果您使用混合对象,则需要在每个实体对象之后绘制一个,并从后到前进行。因为您需要将颜色与紧随其后的对象混合。

【讨论】:

@OrgnlDave 说得好。像素填充很昂贵。它是管道中需要对共享资源进行写访问的一个点。顶点着色器可以并行运行并同时生成几何列表,但是当像素着色器写入颜色缓冲区或 Z 缓冲区时,一次只有一个程序可以访问相同的内存。从前到后渲染不透明几何体,以消除被覆盖对象上的像素填充,然后从后到前渲染非透明几何体,因此被遮挡的几何体将在 alpha 混合中具有权重。

以上是关于我是不是错误地渲染了 BSP 树?的主要内容,如果未能解决你的问题,请参考以下文章

使用资产目录和大小类错误地渲染 UIButton 的图像属性

Chrome 和 Safari 中子弹列表菜单的 CSS 渲染

浏览器是如何渲染页面的?

在错误位置渲染的顶点(OpenGl)

从浏览器渲染原理谈动画性能优化

关闭时,有条件地在图例中错误地渲染段中的段