5

我有一个巨大的网格(100k 三角形),需要绘制几次并将每一帧融合在一起。是否可以重用网格第一遍的顶点着色器输出,并在以后的遍中跳过顶点阶段?我希望在顶点管道和光栅化上节省一些成本。

面向 OpenGL 3.0,可以使用变换反馈等功能。

4

1 回答 1

5

我会先回答你的基本问题,然后再回答你真正的问题。

是的,您可以存储顶点变换的输出以供以后使用。这称为变换反馈。它需要 OpenGL 3.x 级硬件或更好的硬件(又名:DX10 硬件)。

它的工作方式分为两个阶段。首先,您必须将程序设置为具有基于反馈的变化。你用glTransformFeedbackVaryings. 这必须在链接程序之前完成,类似于glBindAttribLocation.

完成后,您需要将缓冲区(根据您设置变换反馈变化的方式)绑定到GL_TRANSFORM_FEEDBACK_BUFFERwith glBindBufferRange,从而设置将数据写入哪些缓冲区。然后您使用 glBeginTransformFeedback 开始您的反馈操作并正常进行。您可以使用原始查询对象来获取写入的原始数量(以便以后可以使用 绘制glDrawArrays),或者如果您有 4.x 级硬件(或 AMD 3.x 硬件,所有这些都支持 ARB_transform_feedback2),您可以在不查询基元数量的情况下进行渲染。这样可以节省时间。

现在对于您的实际问题:它可能不会帮助您购买任何真正的性能。

您正在绘制地形。地形并没有真正得到任何转变。通常你有一个或两个矩阵乘法,可能有法线(尽管如果你正在渲染阴影贴图,你甚至没有那个)。就是这样。

很有可能,如果你用这样一个简单的着色器将 100,000 个顶点向下推到 GPU 上,你可能已经饱和了 GPU 渲染它们的能力。您可能会在原始装配/设置上遇到瓶颈,而且速度不会更快。

所以你可能不会从中得到太多。反馈通常用于生成三角形数据以供以后使用(有效的伪计算着色器),或用于保存复杂变换的结果,如使用双四元数的矩阵调色板蒙皮等。一个简单的矩阵乘法运算几乎不会成为雷达上的一个亮点。

如果你喜欢,你可以试试。但很有可能你不会有任何问题。通常,最好的解决方案是采用某种形式的延迟渲染,这样您只需为对象投射的每个阴影渲染一次 + X(其中 X 由阴影映射算法确定)。而且由于阴影贴图需要不同的变换,因此无论如何您都不会从反馈中获得任何收益。

于 2012-10-16T07:42:12.417 回答