【发布时间】:2016-09-29 03:20:15
【问题描述】:
为了在顶点着色器中插入顶点位置以在两个变形目标之间进行变形动画,我发送到着色器的两个顶点位置。现在我有一个网格,它有大约 600 个变形目标,我觉得尝试发送到顶点着色器 600 个顶点位置不是一个好主意。有人可以告诉我用这么多变形目标为对象设置动画的正确方法是什么?
附:我对 3d 编程很陌生。
【问题讨论】:
标签: opengl-es glsl opengl-es-2.0 morphing
为了在顶点着色器中插入顶点位置以在两个变形目标之间进行变形动画,我发送到着色器的两个顶点位置。现在我有一个网格,它有大约 600 个变形目标,我觉得尝试发送到顶点着色器 600 个顶点位置不是一个好主意。有人可以告诉我用这么多变形目标为对象设置动画的正确方法是什么?
附:我对 3d 编程很陌生。
【问题讨论】:
标签: opengl-es glsl opengl-es-2.0 morphing
这个想法很简单:只发送你真正打算使用的变形目标数据。
将所有变形目标数据放在一个缓冲区中。渲染时,请在您正在变形的两个位置属性中的每一个上使用glVertexAttribPointer。使用该函数指定特定变形目标的字节偏移量。
举个例子,想象一下下面的缓冲内存布局:
|----Morph Target 0----|----Morph Target 1----|----...----|----Morph Target N----|
K L M Z
要在目标 0 和 1 之间混合,请调用 glVertexAttribPointer(0, ..., (void*)K) 和 glVertexAttribPointer(1, ..., (void*)L),其中 K 和 L 是缓冲区中变形目标的偏移量。
显然,您只能在两个变形目标之间进行混合。但你可以混合任何两者。
我觉得尝试向顶点着色器发送 600 个顶点位置不是一个好主意。
这是不可能的。属性的数量受到实现的限制,而且这个数量通常很小(在 16 到 32 之间)。
【讨论】: