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

时间:2012-10-16 06:56:46

标签: opengl glsl vertex-shader

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

目标OpenGL 3.0,可以使用转换反馈等功能。

1 个答案:

答案 0 :(得分:4)

我先回答您的基本问题,然后回答您的真实问题。

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

它的工作方式分为两个阶段。首先,您必须将程序设置为基于反馈的变化。您可以使用glTransformFeedbackVaryings执行此操作。这必须在链接程序之前以与glBindAttribLocation类似的方式完成。

完成后,您需要将缓冲区(给定如何设置变换反馈变化)与GL_TRANSFORM_FEEDBACK_BUFFER绑定到glBindBufferRange,从而设置将数据写入哪些缓冲区。然后使用glBeginTransformFeedback开始反馈操作并正常进行。您可以使用primitive query object来获取写入的基元数量(以便稍后可以使用glDrawArrays绘制),或者如果您具有4.x级硬件(或AMD 3.x硬件,所有这些都支持ARB_transform_feedback2),你可以render without querying the number of primitives。这样可以节省时间。

现在您的实际问题:它可能不会帮助您获得任何真正的表现。

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

如果你用如此简单的着色器将100,000个顶点向下移动到GPU上,那么你很可能已经让GPU无法全部渲染它们。您可能会遇到原始装配/设置的瓶颈,并且没有得到更快的速度。

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

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