【发布时间】:2012-01-07 03:49:15
【问题描述】:
我想通过渲染和叠加混合在一帧过程中轨迹中多个点的移动对象来创建运动模糊效果。
我在想确定绘制位置的计算可以在顶点着色器中执行。不过,在我看来,如果我想避免为每个渲染传递几何图形,我可能需要使用几何着色器。
我最好的做法是什么?我正在选择:
- 手动组装每个子帧的顶点数据,每次都将其传递给 GPU(如果我这样做,我不需要顶点程序)
- 将几何图形连同速度值一起发送。我可以计算顶点着色器中的中间位置,但我不确定如何指定将某个速度值分配给某些图元组。我需要为每个子帧渲染发送一次相同的顶点,因为顶点着色器无法创建新顶点。
- 使用几何着色器为所有子帧生成所有几何。在整个渲染过程中,我应该能够在不来回传递任何数据的情况下获取所有子帧。
我想在这里达到的平衡是,我希望尽可能少地进行冗余数据传递,同时支持尽可能多的硬件。似乎我应该能够使用顶点缓冲区对象来存储我的几何数据,并且只需传递一些制服以在每次渲染时将速度数据发送到顶点着色器。那样有用吗? VBO 缓冲区也是持久的,因此为了获得最佳性能,我应该根据需要介入并修改几何数据,对吗?
另一个我不知道如何处理的潜在问题是我想通过插值刚性对象在框架上遍历的平移和旋转来准确地绘制我的中间位置,而不是仅仅插值得到的顶点位置。这里的区别在于旋转的物体会留下弯曲的条纹。
有什么方法可以避免为每个单独的动态刚性对象发出调用吗?也许我可以使用通用顶点属性来发送我的速度?这有点多余,因为我可以拥有一个具有 100 个顶点且具有相同速度数据的对象,但至少我的着色器可以通过这种方式获取这些数据流。
在我看来,通过在 GPU 上执行顶点变换可能不会获得太多收益:我必须传入一个速度向量、一个角速度标量和一个质心向量作为顶点属性。这似乎是对带宽的极大浪费。但是,我可以将该数据用于可能大量的“样本”(子帧渲染)。
我已经使用 OpenGL 即时模式很长一段时间了,但这次我想做正确的事情。
更新:请参阅扩展评论讨论以了解其所采取的方向。我现在相当肯定,由于“频闪灯效应”,多个样本不会产生好的结果:在某些速度下,出于性能原因,我需要使用模糊。在那种情况下,我需要积累模糊的子帧;渲染子帧然后模糊它仍然会留下伪影。
【问题讨论】:
标签: c++ opengl graphics opengl-es shader