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

Gio*_*ena 2 c++ opengl shader animation vertex

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

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

GMa*_*cci 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的性能可能比处理网格时的CPU高几十,几百甚至几千倍,因此很快就会明白为什么在这个区域尽可能多地将性能编码归于GPU.

希望这可以帮助:)


Mir*_*pas 1

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

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

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