繁体   English   中英

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

[英]OpenGL - Are animations done by shaders?

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

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

两种方式都可以正常工作:如果您的目标是更多地利用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的性能可能比处理网格时的CPU高几十,几百甚至几千倍,因此很快就会明白为什么在这个区域尽可能多地进行高性能编码。

希望这可以帮助:)

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM