2016-04-23 72 views
3

对于最新的Ludum Dare比赛,主题是变形,所以我的想法涉及从一个几何形状到另一个几何形状的简单变形。如何使用着色器将一个3D对象变形为另一个3D对象?

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

Morphing shapes

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

因为我很少有时间我只是做了一些快速和肮脏的,但现在我认为这不是一个很好的方法来完成这个过程,因为我必须每帧都上传大量数据到GPU。如果我想要在不同的变形阶段绘制多个变形对象,它看起来也不可伸缩。

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

但我想知道:有没有办法以多种方式发送多个(两个)对象/缓冲区到着色器,以及插值率统一,然后在着色器中我会进行插值?

+0

创建一个同时包含两个对象的缓冲区 – teivaz

+0

@teivaz在我只有一个变形对象的情况下,这是一个好主意。但是如果我有多个物体,在最坏的情况下,我可能必须为每种可能的组合创建多个VAO。 – aslg

+0

听起来像管道镶嵌部分的好工作。总有Compute着色器和CUDA/OpenCL interop用于不适合经典流水线的东西。 – Drop

回答

5

您可以创建一个缓冲区,为每个顶点保存多个坐标。就像通常你有坐标,法线,纹理坐标你可以有坐标1,坐标2,坐标3等。然后在着色器中,你可以有一个统一的变量,说明使用哪一个。

有了两个,它当然很容易,因为统一将从零到一个,并且只需将第一个坐标与它相乘,并添加第二个乘以(1.0 - 值)。

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

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

这里减去的是,你通过着色器更多地跳过内存所需的数据越多,如果你有很多表单,它可能不是最漂亮的解决方案。

相关问题