gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:36:54 24 4
gpt4 key购买 nike

最近的 Ludum Dare 比赛的主题是变形,所以我的想法涉及从一种几何形状简单变形为另一种几何形状。

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

Morphing shapes

(顶点有不同的顺序,所以变形不是“平滑的”)

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

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

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

最佳答案

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

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

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

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

这样做的缺点是,您输入的数据越多,着色器就必须在内存中跳过越多,因此如果您有很多表单,它可能不是最漂亮的解决方案。

关于c++ - 我如何使用着色器将一个 3D 对象变形为另一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36809479/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com