我开始学习OpenGL,并学习了如何使用Vertex和Fragment着色器显示数字和内容。 我创造了一个(非常)风格化的男人,现在我想让它移动他的胳膊和腿。 问题是:我应该更改VBO中的顶点数据,直接在main中调用的计时器函数(正如我所做的那样),还是应该在顶点着色器中完成的工作,而不接触顶点数据?
我认为答案是第一个,但我觉得它会使CPU过载,而不是让GPU工作。
答案 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侧的模型(每个框8个点,而不是每个网格数百万个点)。如果边界框碰撞,则从GPU转移网格 - > CPU并进行精细计算以获得精确的网格到网格碰撞检测。这为两个世界提供了最好的开销。
由于GPU处理网格时GPU的性能可能比数十,数百甚至数千倍高,因此很快就会明白为什么在这个区域尽可能多地进行高性能编码。 p>
希望这会有所帮助:)
答案 1 :(得分:1)
根据平台和OpenGL版本,您可以通过直接更改顶点缓冲区中的数据(软件动画)或通过将顶点组与相应的动画矩阵(硬件动画)相关联来执行动画。
如果您选择第二种方法(建议尽可能使用),您可以将这些矩阵中的一个或多个作为制服发送到顶点着色器,也可以为每个矩阵关联一些“权重”因子。
请记住,当您拥有非常多的顶点并且硬件动画几乎是免费的时,软件动画会使CPU过载,您只需将顶点与正确的矩阵相乘,而不是在着色器中使用模型 - 视图 - 投影。此外,GPU还针对数学运算进行了高度优化,与CPU相比速度非常快。