OpenGL - 动画是由着色器完成的吗?

Posted

技术标签:

【中文标题】OpenGL - 动画是由着色器完成的吗?【英文标题】:OpenGL - Are animations done by shaders? 【发布时间】:2014-04-02 12:26:15 【问题描述】:

我开始学习 OpenGL,并学会了如何使用顶点和片段着色器来显示图形和东西。 我创造了一个(非常)程式化的人,现在我想让它移动他的胳膊和腿。 问题是:我应该直接在 main 中调用的计时器函数中更改 VBO 中的顶点数据(就像我所做的那样),还是应该在顶点着色器中完成一项工作,而不接触顶点数据?

我想答案是第一个,但我觉得它会使 CPU 过载,而不是让 GPU 工作。

【问题讨论】:

【参考方案1】:

两种方法都可以正常工作:如果您的目标是更多地利用 GPU,然后在顶点着色器中进行转换,否则您可以使用 CPU。但是请记住,如果检查冲突,您需要 CPU 端存在数据....

本质上:

在 GPU 上进行操作意味着您只需要发送一次网格数据,然后您可以发送矩阵变换来对其进行变形或动画处理。 这是理想的,因为它大大降低了 CPU-> GPU 之间的数据传输带宽。 这也可能意味着您可以仅将网格的一份副本上传到 GPU,并对网格的许多不同实例应用变换以实现不同但相似的模型(即发送到 GPU 的熊网格以规模 *2 规模 *1 制作实例并为熊爸爸、熊妈妈和熊宝宝缩放 *0.5,然后发送一个 Goldilocks 网格,现在您在内存中有 2 个网格以获得 4 个不同的模型)。

但是,转换后的网格不会立即在 CPU 端可用,因此网格完美碰撞检测将更加密集。

在 CPU 上制作动画意味着您可以访问转换后的网格,但主要需要注意的是,您必须在每一帧和每个实例中将整个网格上传到 GPU:更多的工作、更多的数据和更多的内存在两个 CPU 上用完和 GPU 方面。

CPU 优势

当前的精确网格可随时用于您需要的任何目的。

CPU 缺点

CPU 和 GPU 之间的海量数据传输:每个实例每个模型每个帧一个传输

GPU 优势:

上传较少的网格数据(如果您只需要一个模型的变体,则一次) 以快速并行方式转换单个实例 CPU->GPU 带宽最小化:只需要发送转换 GPU 是并行化的,可以比 CPU 更高效地处理网格数据

GPU 的缺点

网格不适合网格完美的碰撞检测

缓解将 GPU 数据传输回 CPU 的开销:

利用边界框(轴对齐或非轴对齐,根据您的喜好):这允许小型数据集在 CPU 端表示模型(每个框 8 个点,而不是每个网格数百万个点)。如果边界框发生碰撞,则从 GPU -> CPU 传输网格并进行精细计算以获得精确的网格到网格碰撞检测。这以最少的开销实现了两全其美。

由于在处理网格时 GPU 的性能可能比 CPU 高出数十、数百甚至数千倍,因此很快就会明白为什么要将这一领域的高性能编码外包给 GPU。

p>

希望这会有所帮助:)

【讨论】:

belanecbn.sk/3dtutorials/index.php?id=20 有一个很好的关于如何执行着色器动画的演示,lcg.ufrj.br/Cursos/GPUProg/GLSLfirst 有另一组有用的链接,antongerdelan.net/opengl 有一些有用的链接,最后@987654324 有一个方便的练习列表@ 该评论中的第一个链接将我转到一个被我的 ESET 防病毒软件阻止的站点,说它有木马,所以要小心。 他们发布时没有任何木马,但是我回家后会检查它们,如果需要,可能会将原始代码发布到其他地方:) 不用担心,我确实看到它是从 2014 年开始的,并且无法知道链接将来是否会变坏,所以只是想向遇到您答案的其他人指出/将来发表评论!【参考方案2】:

根据平台和 OpenGL 版本,您可以通过直接更改顶点缓冲区中的数据(软件动画)或将顶点组与相应的动画矩阵(硬件动画)相关联来制作动画。

如果您选择第二种方法(在可能的情况下推荐),您可以将这些矩阵中的一个或多个作为统一发送到顶点着色器,可能为每个矩阵关联一些“权重”因子。

请记住,当您拥有大量顶点时,软件动画会使 CPU 过载,而硬件动画几乎是免费的,您只需将顶点与正确的矩阵相乘,而不是着色器中的模型-视图-投影一. GPU 还针对数学运算进行了高度优化,并且与 CPU 相比速度非常快。

【讨论】:

感谢您的回答,但我是这个“领域”的新手,所以我不太了解如何制作硬件动画。 “动画矩阵”是什么意思,这个“权重”因子是什么? 您可以从OpenGL网页查看本教程:opengl.org/wiki/Skeletal_Animation

以上是关于OpenGL - 动画是由着色器完成的吗?的主要内容,如果未能解决你的问题,请参考以下文章

初识OpenGL 链接着色器

初识OpenGL 链接着色器

openGL一些概念02

✠OpenGL-13-几何着色器

OpenGL:缓冲区对象/着色器超出范围

如何使用 OpenGL ES 2.0 着色器完成这些图像处理任务?