【问题标题】:How to prevent overdrawing?如何防止过度绘制?
【发布时间】:2023-04-04 07:16:01
【问题描述】:

这是一个很难在 Google 中搜索的问题,因为它在金融中具有其他含义。

当然,我在这里的意思是“绘图”,如 .. 计算机图形学.. 不是钱..

我有兴趣防止 3D 绘图和 2D 绘图的过度绘制。
(我应该把它们分成两个不同的问题吗?)

我意识到这可能是一个非常广泛的问题,因为我没有指定使用哪种技术。如果它太宽泛,也许对我可以阅读的一些资源的一些提示是可以的。

编辑:
我所说的透支是:

  • 当你绘制太多对象时,渲染单帧会很慢
  • 当你绘制的区域比你需要的多时,渲染单个帧会很慢

【问题讨论】:

  • 我不确定您所说的“透支”是什么意思。也许你的意思是剪辑?
  • 当你画的比你应该画的多的时候。渲染一帧会很慢。
  • 这听起来像是一个 BTree 排序问题 - 确保您只从树的顶部绘制顶点(及其对应的面),按照视口方向排序。这是一篇关于它的 Wiki 文章:en.wikipedia.org/wiki/Hidden_surface_determination
  • 谷歌"graphics culling"。你会得到比“透支”更好的结果。

标签: algorithm graphics rendering


【解决方案1】:

这是一个相当复杂的话题。

首先要考虑的是frustum culling。它会过滤掉不在相机视野中的物体,这样你就可以在渲染阶段传递它们。

第二件事是对相机中的对象进行 Z 排序。最好从前到后渲染它们,这样近处的对象会将“近值”写入深度缓冲区,而远处的对象的像素不会被绘制,因为它们不会通过深度测试。这将节省 GPU 的填充率和像素着色器工作。但请注意,如果场景中有半透明对象,则应先按从后到前的顺序绘制它们,以使 alpha 混合成为可能。

如果您使用某种空间分区(例如OctreeQuadtree),这两件事都可以实现。哪个更好取决于您的游戏。四叉树更适合大型开放空间,八叉树更适合多层次的室内空间。

不要忘记简单的back-face culling,它可以在 DirectX 和 OpenGL 中通过单行启用,以防止绘制用背面看相机的面部。

【讨论】:

    【解决方案2】:

    问题实在是太宽泛了 :o) 查看这些“指针”并更具体地提问。

    典型的透支抑制剂是:

    • Z 缓冲区
    • 基于遮挡的技术(各种缓冲技术、硬件遮挡等)
    • 模板测试

    在更高一点的逻辑电平上:

    • 剔除(通常通过视锥)
    • 场景组织技术(通常是树或平铺)
    • 从前到后的粗略绘图(这显然是辅助技术:o)

    编辑:添加了模板测试,确实具有有趣的透支预防用途,尤其是在 2d/3d 的组合中。

    【讨论】:

      【解决方案3】:

      根据距离和位置减少您考虑绘制的对象数量(即拒绝视锥体之外的对象)。

      还可以考虑使用某种基于对象的遮挡系统来允许大对象遮挡小对象。但是,除非您有很多形状相当规则的大型物体,否则这可能不值得。在某些情况下,您可以预处理静态对象的潜在可见集。

      您的 API 通常也会拒绝不面向视点的多边形,因为您通常不想绘制背面。

      当涉及到实际渲染时间时,从前到后渲染不透明对象通常很有帮助,因此深度缓冲区测试最终会拒绝整个多边形。如果您打开了深度缓冲,这也适用于 2D。

      请记住,这是一个性能优化问题。大多数应用程序不会有过度绘制的重大问题。在花费资源解决问题之前,请使用 PixNVIDIA PerfHUD 等工具来衡量您的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-10
        • 1970-01-01
        • 1970-01-01
        • 2016-10-04
        • 1970-01-01
        • 2011-09-26
        • 2017-04-19
        相关资源
        最近更新 更多