以后可以重用 glsl 顶点着色器输出吗?

she*_*nbo 5 opengl glsl vertex-shader

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

针对 OpenGL 3.0,可以使用变换反馈等功能。

Nic*_*las 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 由阴影映射算法确定)。而且由于阴影贴图需要不同的变换,因此无论如何您都不会从反馈中获得任何好处。