2012-10-16 43 views
3

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

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

+0

100k不是我会说的一个数字。提及您计划应用程序的硬件/ gpu。 – Abhinav

+0

针对现代消费电脑。我有测试卡,包括nvidia GTS450,GT570,GT650M和一些相当的ati卡。 – shenbo

+0

这是一个地形系统,​​100k是一个补丁。我试图控制每帧画出的三角形总数达到100万左右。目前地形系统消耗大约700k。他们大多数是补丁(最高检测限) – shenbo

回答

4

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

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

它的工作方式分两个阶段。首先,你必须设置你的程序以获得基于反馈的变化。你用glTransformFeedbackVaryings来做到这一点。在连接程序之前必须完成,类似于glBindAttribLocation之类的操作。

一旦完成,你需要绑定缓冲区(给定你如何设置变换反馈的变化)到GL_TRANSFORM_FEEDBACK_BUFFERglBindBufferRange,从而设置将数据写入哪些缓冲区。然后,您使用glBeginTransformFeedback开始您的反馈操作,并照常进行。您可以使用primitive query object获得书面(这样就可以用glDrawArrays后绘制)元的数目,或者如果你有4.x的一流的硬件(或AMD 3.X的硬件,所有这些都支持ARB_transform_feedback2),你可以render without querying the number of primitives。这会节省时间。

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

您正在绘制地形。地形并没有真正发生转变。通常情况下,你有一个或两个矩阵乘法,可能与法线(但如果你正在渲染阴影地图,你甚至没有)。而已。

赔率是非常好的,如果你推100000个顶点向下GPU这样一个简单的着色器,你可能已经饱和了GPU的渲染他们所有的能力。你可能会在原始的装配/设置上遇到瓶颈,而且速度不会更快。

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

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

+0

感谢您的快速回复。我在我的引擎中实现了变换反馈。 'glDrawArrays'是否仍然通过顶点管道推送所有数据?也许我应该把我的问题改为“重用光栅化结果”〜 – shenbo

+0

@shenbo:是的。它被称为“延迟渲染”。 –

+0

我已经在照明计算中使用延迟方法。只是想知道是否有任何方法完全跳过顶点着色器阶段。似乎目前还不可能。接受答案。 – shenbo