【问题标题】:Batching Multiple Draw Calls When Draw Order Matters当绘制顺序很重要时批处理多个绘制调用
【发布时间】:2013-11-27 09:20:00
【问题描述】:

我试图弄清楚如何在基于 OpenGL/DirectX 的应用程序中实现批处理。我知道,当启用深度测试/深度写入时,我可以将一堆使用通用材质渲染的对象放在同一坐标空间中,并使用单个绘图调用进行绘制。但在我的特定应用程序中,我有几个对象针对深度缓冲区进行测试,但不写入深度缓冲区,并依靠绘制顺序获得正确的外观。这些通常是 3D 世界中的 2D 几何体(例如具有动态信息的面板)。

我可以使用一个通用的解决方案来批量处理通常需要特定绘制顺序的物品吗?还是我需要调整我的场景并在所有内容上启用深度写入以利用批处理?

【问题讨论】:

  • 例如具有动态信息的面板。你的意思是说场景中已经存在的物体如果深度足够的话可以遮挡这些物体(例如更近并且深度函数是LESS)?我想知道为什么您不希望他们写入深度缓冲区?如果您允许它们写入深度缓冲区并首先绘制它们,您可以在您的 GUI 完全遮挡具有潜在昂贵像素/片段着色器要评估的世界几何图形的区域提高性能。
  • 基本上有几个 2d 对象被写入同一个位置来组成一个面板。其中一个对象将进行深度写入,其余对象将仅进行深度测试,因为写入会导致 z-fighting 以及随后绘制到该位置。

标签: performance opengl graphics directx


【解决方案1】:

GPU 将按几何顺序渲染,即使在单个绘图调用中也是如此。换句话说,第一个三角形将在第二个三角形之前绘制,依此类推——即使着色计算可能并行发生。

所以你不需要在这里做任何特别的事情。只要您的实例在批次中按绘制顺序排列,结果将与您使用多个绘制调用相同。

【讨论】:

    【解决方案2】:

    您可以将标准化 Z 空间划分为 N(2D 对象的数量),然后使用与您的绘制顺序相对应的不同标准化 Z 值来跟踪每个对象,并让深度测试为您进行“排序”。

    【讨论】:

    • 请记住,您可能必须使用非线性分区算法,因为深度范围不是线性的。如果您需要更多信息,请告诉我。
    • 我很熟悉为什么深度缓冲区是非线性的,但不是任何“非线性分区”算法。如果你有额外的信息,我会接受的!
    • 嗯,这是我刚刚发明的一个术语。想象一个从 0 到 500 的线性深度范围。如果要绘制 500 个 2D 项目,只需按照要跟踪它们的“顺序”为每个项目分配一个 Z 值(就像没有深度写入一样)。但是启用深度写入后,OpenGL 将为您解决问题。我不是 100% 确定你需要这样做。您是否尝试过不写入深度缓冲区?
    猜你喜欢
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多