OpenGL - 着色器是否完成了动画?

时间:2014-04-02 12:26:15

标签: c++ opengl animation shader vertex

我开始学习OpenGL,并学习了如何使用Vertex和Fragment着色器显示数字和内容。 我创造了一个(非常)风格化的男人,现在我想让它移动他的胳膊和腿。 问题是:我应该更改VBO中的顶点数据,直接在main中调用的计时器函数(正如我所做的那样),还是应该在顶点着色器中完成的工作,而不接触顶点数据?

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

2 个答案:

答案 0 :(得分:13)

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

本质上:

在GPU上进行操作意味着您只需要发送一次网格数据,然后您可以发送矩阵变换以对其进行变形或动画处理。 这是理想的,因为它大大降低了CPU-> GPU之间的数据传输带宽。 它也可能意味着您只需将网格的一个副本上传到GPU并对网格的许多不同实例应用变换以实现不同但相似的模型(即,发送到GPU的熊网格可以实现规模* 2比例* 1和Daddy bear,Mummy bear和Baby bear的比例* 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处理网格时GPU的性能可能比数十,数百甚至数千倍高,因此很快就会明白为什么在这个区域尽可能多地进行高性能编码。 p>

希望这会有所帮助:)

答案 1 :(得分:1)

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

如果您选择第二种方法(建议尽可能使用),您可以将这些矩阵中的一个或多个作为制服发送到顶点着色器,也可以为每个矩阵关联一些“权重”因子。

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