C++ 在这种情况下我应该使用顶点着色器吗?

C++ 在这种情况下我应该使用顶点着色器吗?,c++,opengl,graphics,opengl-es,shader,C++,Opengl,Graphics,Opengl Es,Shader,我想通过渲染和添加混合运动对象在一帧过程中轨迹上的多个点来创建运动模糊效果 我认为确定绘制位置的计算可以在顶点着色器中执行。但是,在我看来,如果我想避免为每个渲染传递几何体,我可能需要使用几何体着色器 我最好的做法是什么?我决定: 手动组装每个子帧的顶点数据,并每次将其传递给GPU(如果这样做,我不需要顶点程序) 将几何图形与速度值一起发送。我可以计算顶点着色器中的中间位置,但我不确定如何指定将特定速度值指定给特定的基本体组。我需要为每个子帧渲染发送一次相同的顶点,因为顶点着色器无法创建新顶点

我想通过渲染和添加混合运动对象在一帧过程中轨迹上的多个点来创建运动模糊效果

我认为确定绘制位置的计算可以在顶点着色器中执行。但是,在我看来,如果我想避免为每个渲染传递几何体,我可能需要使用几何体着色器

我最好的做法是什么?我决定:

  • 手动组装每个子帧的顶点数据,并每次将其传递给GPU(如果这样做,我不需要顶点程序)
  • 将几何图形与速度值一起发送。我可以计算顶点着色器中的中间位置,但我不确定如何指定将特定速度值指定给特定的基本体组。我需要为每个子帧渲染发送一次相同的顶点,因为顶点着色器无法创建新顶点
  • 使用几何体着色器为所有子帧生成所有几何体。在整个渲染过程中,我应该能够在不来回传递任何数据的情况下获得所有子帧 我想在这里达成的平衡是,我希望在支持尽可能多的硬件的同时,尽量减少冗余数据的传递。看起来我应该能够使用顶点缓冲区对象来存储我的几何体数据,并且只需传递一些制服即可将速度数据发送到每个渲染上的顶点着色器。这样行吗?另外,VBO缓冲区是持久的,所以为了获得最佳性能,我应该根据需要介入并修改几何体数据,对吗

    另一个我不知道如何处理的潜在问题是,我希望通过插值刚性对象在帧上穿过的平移和旋转来精确绘制中间位置,而不是仅插值生成的顶点位置。这里的区别是旋转的物体会留下一条弯曲的条纹

    是否有某种方法可以避免对每个单独的动态刚体对象发出调用?也许我可以使用一个通用的顶点属性来发送我的速度?这会有点多余,因为我可以有一个具有100个顶点且具有相同速度数据的对象,但至少我的着色器可以通过这种方式获得该数据流

    在我看来,在GPU上执行顶点变换可能不会获得太多好处:我必须传入一个速度向量、一个角速度标量和一个质心向量作为顶点属性。这似乎是对带宽的巨大浪费。但是,我可以将该数据用于潜在的大量“样本”(子帧渲染)

    我已经使用OpenGL即时模式很长一段时间了,但这次我想做正确的事情

    更新:请参阅扩展评论讨论,了解其方向。我现在相当肯定,由于“闪光灯效应”,多个样本不会产生好的结果:在某些速度下,出于性能原因,我需要使用模糊。在这种情况下,我需要积累模糊的子帧;渲染子帧然后使其模糊仍然会留下瑕疵

    软件渲染子帧-考虑这是“基线”情况。
  • 顶点着色器-可以这样做,但不要尝试发送几何体速度,只发送顶点速度:

    将帧渲染到VBO,调用glVertexAttrib以包括每个顶点的当前速度和加速度。重复渲染VBO,使用统一的值指定每个子帧的时间偏移

    顶点着色器随后需要基于统一的时间值应用offest

  • 几何体着色器-如果你使用这个,你可以像#2一样实现它,除了“循环和变化”将在着色器中实现之外-帮助GPU卸载更多的工作

  • 你还提到:

    • 使用VBO渲染所有内容-如果您使用这样的VBO/显示列表,您基本上可以使用更高硬件加速的选项#1
    • 插值问题-可能不值得您努力获得精确的插值。除非对象移动得非常快且弯曲,否则速度的线性插值(一阶)可能很好。您还可以通过包括加速(二阶)来改进它,但额外的阶数或更精确的物理模型可能值得付出努力或成本
    • 可能不值得——这才是问题的症结所在。根据您的应用程序、硬件和其他细节,这些可能的解决方案中的任何一个都可能优于另一个。如果性能很重要,您可能应该尝试每一个的原型实现,并在您的目标设备上运行基准测试,以查看什么最适合。(可悲的现实是,在完成所有工作之前,您无法轻松执行基准测试。)
    我想通过渲染和添加混合运动对象在一帧过程中轨迹上的多个点来创建运动模糊效果


    这当然是实现运动模糊的一种方法。但是现在运动模糊是通过片段着色器中的向量模糊后处理过滤器实现的。有关其工作原理的说明,请参见。为了实时,必须使用后期处理着色器再现该过程。

    有趣的链接。谢谢我正在渲染一个2d场景,我想做的是利用快速图形管道,通过多次渲染同一对象而不是只渲染一次并进行处理,来产生更高的保真度结果。@StevenLu:矢量模糊也适用于2d。“快速图形管道”指的是什么?我以前的2d运动模糊实现使用了带有片段着色器的方向模糊方法,问题是它会模糊和混合非运动对象