我想通过在帧的多个时间点上渲染和叠加混合移动对象来创建运动模糊效果。
我认为可以在顶点着色器中执行确定绘制位置的计算。不过,如果要避免为每次渲染传递几何体,则可能需要使用几何着色器。
我的最佳行动方案是什么?我正在考虑以下两种选择:
1.手动组装每个子帧的顶点数据并每次将其传递到GPU(如果这样做,则不需要顶点程序)。 2.沿着速度值发送几何体。我可以在顶点着色器中计算中间位置,但我不确定如何指定某个速度值分配给某些基元组。由于顶点着色器无法创建新的顶点,因此每个子帧渲染都需要一次发送相同的顶点。 3.使用几何着色器为所有子帧生成所有几何体。我应该能够在整个渲染过程中不传递任何数据就获取所有子帧。
我想要达成的平衡是尽量减少冗余数据传递,同时支持尽可能多的硬件。看起来我应该能够使用顶点缓冲对象来存储我的几何数据,并只传递一些uniform变量以在每次渲染时将速度数据发送到顶点着色器。这样可以吗?另外,VBO缓冲区是持久的,因此为了获得最佳性能,我应该根据需要定期进行几何数据的步进和修改,对吗?
我不知道如何处理的另一个潜在问题是,我想通过插值刚体对象在帧上遍历的平移和旋转来准确绘制中间位置,而不仅仅是插值结果顶点位置本身。区别在于旋转的物体会留下弯曲的条纹。
有没有办法防止为每个单独的动态刚体发出调用?也许我可以使用通用顶点属性来发送我的速度?这有些冗余,因为我可以拥有具有相同速度数据的100个顶点的对象,但至少这样我的着色器可以以这种方式获取数据流。
在GPU上执行顶点变换可能没有太多可获得的好处:我必须将速度向量、角速度标量和质心向量作为顶点属性传递。这似乎是一种带宽浪费。但是,我可以将该数据用于潜在的大量“样本”(子帧渲染)。
我很长时间以来一直在使用OpenGL即时模式,但这次我想做正确的事情。
更新:请参见扩展的评论讨论以获取其方向。我现在相当确定多个样本不会产生好结果,因为存在“闪光灯效应”:在某些速度下,我需要出于性能原因使用模糊。在这种情况下,我需要累积模糊的子帧;渲染子帧然后对其进行模糊处理仍将留下伪影。
我认为可以在顶点着色器中执行确定绘制位置的计算。不过,如果要避免为每次渲染传递几何体,则可能需要使用几何着色器。
我的最佳行动方案是什么?我正在考虑以下两种选择:
1.手动组装每个子帧的顶点数据并每次将其传递到GPU(如果这样做,则不需要顶点程序)。 2.沿着速度值发送几何体。我可以在顶点着色器中计算中间位置,但我不确定如何指定某个速度值分配给某些基元组。由于顶点着色器无法创建新的顶点,因此每个子帧渲染都需要一次发送相同的顶点。 3.使用几何着色器为所有子帧生成所有几何体。我应该能够在整个渲染过程中不传递任何数据就获取所有子帧。
我想要达成的平衡是尽量减少冗余数据传递,同时支持尽可能多的硬件。看起来我应该能够使用顶点缓冲对象来存储我的几何数据,并只传递一些uniform变量以在每次渲染时将速度数据发送到顶点着色器。这样可以吗?另外,VBO缓冲区是持久的,因此为了获得最佳性能,我应该根据需要定期进行几何数据的步进和修改,对吗?
我不知道如何处理的另一个潜在问题是,我想通过插值刚体对象在帧上遍历的平移和旋转来准确绘制中间位置,而不仅仅是插值结果顶点位置本身。区别在于旋转的物体会留下弯曲的条纹。
有没有办法防止为每个单独的动态刚体发出调用?也许我可以使用通用顶点属性来发送我的速度?这有些冗余,因为我可以拥有具有相同速度数据的100个顶点的对象,但至少这样我的着色器可以以这种方式获取数据流。
在GPU上执行顶点变换可能没有太多可获得的好处:我必须将速度向量、角速度标量和质心向量作为顶点属性传递。这似乎是一种带宽浪费。但是,我可以将该数据用于潜在的大量“样本”(子帧渲染)。
我很长时间以来一直在使用OpenGL即时模式,但这次我想做正确的事情。
更新:请参见扩展的评论讨论以获取其方向。我现在相当确定多个样本不会产生好结果,因为存在“闪光灯效应”:在某些速度下,我需要出于性能原因使用模糊。在这种情况下,我需要累积模糊的子帧;渲染子帧然后对其进行模糊处理仍将留下伪影。