如何使用着色器将一个3D对象变形为另一个?

时间:2016-04-23 10:17:31

标签: c++ opengl 3d

对于最新的Ludum Dare比赛,主题是变形,所以我的想法涉及从一个几何形状到另一个几何形状的简单变形。

所以我做的是我在Blender中制作了一些具有相同顶点数的对象。在OpenGL中,我为每个对象创建了单独的VAO,并为“变形”对象创建了一个额外的VAO(带有动态绘制属性)。每个帧,当玩家变形时,我会将当前对象和目标对象之间的插值顶点数据上传到这个额外的VAO中,然后渲染。否则只渲染对象的相应VAO。 Morphing看起来像这样:

Morphing shapes

(顶点的排序不同,因此变形不是“平滑”)

由于我没有多少时间做出快速而肮脏的事情,但现在我认为这不是一个很好的方法来完成这个过程,因为我必须每帧都向GPU上传大量数据。如果我想在不同的变形阶段绘制多个变形对象,它也看起来不可扩展。

作为改进此过程的第一步,我想将这些插值计算移动到着色器中。 我可以将单个VAO中的所有对象的数据存储在单独的属性中,然后选择要插入的属性。

但是我想知道:有没有办法以某种方式将多个(两个)对象/缓冲区发送到着色器中,同时插值速率均匀,然后在着色器中我会进行插值?

1 个答案:

答案 0 :(得分:5)

您可以创建一个缓冲区,其中包含每个顶点的多个坐标。就像通常你有坐标,法线,纹理坐标,你可以有coordinate1,coordinate2,coordinate3等。然后在着色器中你可以有一个统一的变量,说明要使用哪个。

有两个它当然很容易,因为制服将从零到一个你只需将第一个坐标与它相乘,然后加上第二个坐标(1.0 - 值)。

然后确保从相同的基本形状创建网格,它们将很好地变形。

此外,如果您使用法线,请确保您有几个法线并在它们之间进行插值。

这里的减号是你通过更多跳过内存中着色器必须这样做的数据,如果你有很多表单,它可能不是最漂亮的解决方案。