OpenGL:绘制一个巨大的灵长类动物的表现

时间:2015-08-10 07:28:30

标签: c++ performance opengl

如果我绘制一个边界远远超过观察区域的大型图元,就像在X和Y(在NDC空间中)覆盖50,000到-50,000的四边形,OpenGL将剪切原始图像,使其表现得与四边形只是几乎没有超过NDC空间边界(例如1.1到-1.1)?

我问的原因是我需要画一个网格来调试相机以及它如何查看空间,我想知道我是否可以跳过手动剪裁网格线的绘制时间。

2 个答案:

答案 0 :(得分:1)

OpenGL中基本上存在3个主要的性能问题。以下是一个非常简化的非常简单的技术错误的解释:如果你的帧率不足,可能会出现什么问题:

  • CPU:如果您进行太多计算或过多的绘制调用或glGets,这是您的瓶颈。
  • 顶点阶段:如果你提供太多顶点,你的顶点指定不当或你有一个非常复杂的顶点着色器,这就是你的瓶颈。
  • 片段阶段:如果你以太高的分辨率绘制,经常在彼此上绘制像素,或者拥有非常复杂的片段着色器,这就是你的瓶颈。

因此,如果我们比较两个场景,那么绘制调用保持不变,顶点保持不变,以及片段?保持不变。 正如评论中已经提到的那样,OpenGL只会产生和计算片段,如果它们最终可能出现在屏幕上,并且不会浪费时间在观看截头体之外。这种效果很容易被注意到,只需用复杂的着色器渲染一些东西,然后远离它,你的帧率会上升,但你不做任何手动剔除。奇妙。

请记住,对于大多数复杂情况而言,只是尝试各种方法的表现是对其表现有用的唯一方法。

答案 1 :(得分:1)

如果硬件按照规范中描述的方式执行剪裁,则绘制巨大的图元将与仅略大于剪辑体积的图像具有相同的性能。根据规范,剪裁发生在剪辑坐标空间中,通过修改来自顶点着色器的顶点坐标,并在必要时添加新顶点。

但这并不能保证剪辑以这种方式发生。与往常一样,实施可以随意做任何他们想做的事情,只要他们表现出就像他们遵循规范描述一样。我们所知道的是,裁剪是基于从顶点着色器出来的顶点发生的,并且位于剪辑体外的片段不会进入片段着色器。

在顶点和片段着色器之间的固定功能块中如何消除不可见部分完全取决于实现。在某些硬件上,它可能发生在顶点空间中。其他人可能首先光栅化,然后消除窗口外的潜在碎片(或剪刀矩形)。或者他们可能会使用两种方法的混合,具体取决于各种标准。

因此,绘制巨大的基元可能会更慢,因为它可能导致额外的光栅化开销。唯一的方法是知道你所关心的系统是否确实存在这种情况,如果它会产生可测量的影响,那就是试一试并测量。