【问题标题】:Quake 3 portal and frustum cullingQuake 3 门户和截锥体剔除
【发布时间】:2012-02-26 00:16:33
【问题描述】:

我正在尝试理解 Quake3 的源代码。

有人知道 (tr_world.c) 文件中的函数 R_MarkLeaves() 是做什么的吗?

我认为这与门户剔除有关?

我需要知道它是如何工作的,所以我也可以在我的代码中实现它以加快渲染速度。

【问题讨论】:

    标签: 3d quake


    【解决方案1】:

    R_MarkLeaves() 标记给定相机/眼睛位置的叶节点(凸壳)的预计算 PVS(潜在可见集)。 BSP树遍历解决了软件渲染的绘制顺序问题(深度排序),但在当时还是造成了过多的overdraw。 PVS 用于修剪从当前节点/位置明显可见的叶节点。

    【讨论】:

    • 嗨,布雷特,感谢您的回复。所以这意味着有更好的方法来解决透支问题?因为我已经在绘制每片叶子之前检查了集群可见性,​​尽管没有使用 R_MarkLeaves(),但我看到即使是不透明墙壁后面的一些不应该可见的几何图形也没有被剔除。 (例如在 q3dm01.bsp 地图中,当我在走廊时,我的代码仍然在走廊中绘制不可见的龙舌)我是否在 PVS rednering 中遗漏了某些东西,或者这是 quake3 bsp 所做的最好的事情?
    • @user565223 - 我似乎记得某些几何形状,如“龙舌”,是贝塞尔曲面 - 即在运行/加载时细分。我怀疑它们是静态渲染的一部分,因为这意味着预先计算的几何体集的大小会爆炸。这些元素可能像其他动态元素(玩家、拾音器等)一样呈现。如果包含此类元素的区域可能可见,则让硬件处理它会更快更容易。
    • 谢谢布雷特,是的,你是对的,那是贝塞尔曲面。我在加载时预先计算了我的贝塞尔曲面的所有几何形状。当我渲染时,地图的某些部分将贝塞尔曲面显示为可能可见,但曲面实际上是隐藏的,但仍会被渲染。而且渲染表面非常昂贵,因为它包含很多面。让 HW 处理它是什么意思?因为我预先计算好的贝塞尔曲线是传递给 GlDrawArrays 类型函数的。
    • 贝塞尔曲面可能被细分为数百个三角形。如果将这些细分为凸包,则会导致大量额外的 BSP 树节点,并添加大量额外的 PVS 条目。由于很少使用此类表面,而且 Q3 无论如何都需要硬件支持,因此不具有成本效益。默认情况下,GL 渲染将使用深度缓冲区测试做正确的事情,但当时的硬件可能受益于在glDepthFunc(GL_ALWAYS)GL_LESS 模式之间切换(默认)。发生这种情况了吗?
    猜你喜欢
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    相关资源
    最近更新 更多