gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:27:56 25 4
gpt4 key购买 nike

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

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

最佳答案

这两种方法都可以正常工作:如果你的目标是更多地利用 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。

希望这有帮助:)

关于c++ - OpenGL - 动画是由着色器完成的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22811450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com