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

标签 c++ opengl graphics opengl-es shader

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

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

我最好的行动方案是什么?我正在决定:

  1. 手动组装每个子帧的顶点数据,每次都将其传递给 GPU(如果我这样做,我就不需要顶点程序)
  2. 发送几何图形和速度值。我可以计算顶点着色器中的中间位置,但我不确定如何指定将某个速度值分配给某些图元组。我需要为每个子帧渲染发送一次相同的顶点,因为顶点着色器无法创建新的顶点。
  3. 使用几何着色器为所有子帧生成所有几何。在整个渲染过程中,我应该能够在不来回传递任何数据的情况下获取所有子帧。

我想在这里取得的平衡是,我希望在支持尽可能多的硬件的同时尽可能减少冗余数据传递。看起来我应该能够使用顶点缓冲区对象来存储我的几何数据,并且只需传递一些制服以将速度数据发送到每个渲染器上的顶点着色器。那样有用吗?此外,VBO 缓冲区是持久的,因此为了获得最佳性能,我应该根据需要介入并修改几何数据,对吗?

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

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

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

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

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

最佳答案

I'd like to create a motion blur effect by rendering and additively blending moving objects at multiple points in their trajectory over the course of a frame.

这当然是实现运动模糊的一种方式。但是现在运动模糊是通过片段着色器中的 vector 模糊后处理过滤器实现的。参见 http://www.blender.org/development/release-logs/blender-242/vector-blur/解释它是如何工作的。对于实时过程,必须使用后处理着色器进行重现。

关于c++ - 在这种情况下我应该使用顶点着色器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8767201/

相关文章:

C++ 从不同的类成员函数调用成员函数

c++ - 常量函数由非常量对象调用。为什么?

c++ - 将像素传递给 glTexImage2D() 后像素会发生什么变化?

java - OpenGL:设置位置而不是翻译?

c++ - OpenGL:VAO/VBO 混淆

opengl - 我的有限 FPS : 60

c++ - 在 C++ 中存储运行时变量

c++ - 使用 std::enable_shared_from_this 时析构函数崩溃

c - 如何在 OpenGL 中获取矩阵堆栈的当前大小?

graphics - 最小化多边形顶点