gpt4 book ai didi

opengl-es - 在 OpenGL ES 中优化骨骼动画的顶点

转载 作者:行者123 更新时间:2023-12-04 21:46:53 30 4
gpt4 key购买 nike

所以我正在使用 2D 骨骼动画系统。

有 X 个骨骼,每个骨骼至少有 1 个部分(一个四边形,两个三角形)。平均而言,我可能有 20 块骨头和 30 个部分。大多数骨骼都依赖于父骨骼,骨骼会每帧移动。每个动画总共有多达 1000 帧,我使用了大约 50 个动画。任何时候在内存中总共加载了大约 50,000 帧。骨骼实例之间的零件不同。

我采用的第一种方法是计算每个骨骼的位置/旋转,并为每个部分构建一个顶点数组,其中包括:

[x1,y1,u1,v1],[x2,y2,u2,v2],[x3,y3,u3,v3],[x4,y4,u4,v4]

并将其传递给每帧 glDrawElements。

看起来不错,涵盖了我需要的所有场景,不占用太多内存,但表现得像条狗。在 iPod 4 上,渲染这些骨架中的 10 个可能会达到 15fps。

我发现大部分性能都被每帧复制如此多的顶点数据所消耗。我决定走向另一个极端,并“预先计算”动画,在开始时为每个角色建立一个顶点缓冲区,其中包含单个角色中每一帧、每一部分的 xyuv 坐标。然后,我计算应该在特定时间使用的帧的索引,并计算一个增量值,该值被传递到用于在当前帧和下一帧 XY 位置之间进行插值的着色器。

顶点看起来像这样,每帧
[--------------------- Frame 1 ---------------------],[------- Frame 2 ------]
[x1,y1,u1,v1,boneIndex],[x2, ...],[x3, ...],[x4, ...],[x1, ...][x2, ...][....]

顶点着色器如下所示:
attribute vec4 a_position;
attribute vec4 a_nextPosition;
attribute vec2 a_texCoords;
attribute float a_boneIndex;

uniform mat4 u_projectionViewMatrix;
uniform float u_boneAlpha[255];

varying vec2 v_texCoords;

void main() {
float alpha = u_boneAlpha[int(a_boneIndex)];
vec4 position = mix(a_position, a_nextPosition, alpha);
gl_Position = u_projectionViewMatrix * position;
v_texCoords = a_texCoords;
}

现在,性能很棒,屏幕上有 10 个,它可以舒适地以 50fps 的速度运行。但是现在,它使用了大量的内存。我通过在 xyuv 上失去一些精度来优化它,现在是 ushorts。

还有一个问题是失去了骨骼依赖性。如果有两个骨骼,一个父子和一个子,并且子在 0s 和 2s 处有一个关键帧,父在 0s、0.5s、1.5s、2s 处有一个关键帧,那么子在 0.5s 和 2s 之间不会发生变化应该是 1.5 秒。

我想出了一个解决这个骨骼问题的解决方案——通过强制 child 在与 parent 相同的点上拥有关键帧。但这会占用更多内存,并且基本上杀死了骨骼层次结构的点。

这就是我现在所处的位置。我试图在性能和内存使用之间找到平衡。我知道这里有很多冗余信息(特定部分的所有帧的 UV 坐标都是相同的,因此重复约 30 次)。并且必须为每组零件创建一个新缓冲区(它们具有唯一的 XYUV 坐标——由于不同的零件尺寸不同,位置会发生变化)

现在我将尝试为每个字符设置一个顶点数组,其中包含所有部分的 xyuv,并计算每个部分的矩阵,并在着色器中重新定位它们。我知道这会起作用,但我担心性能不会比开始时为每一帧上传 XYUV 更好。

有没有更好的方法来做到这一点而不会失去我获得的性能?

有什么我可以尝试的疯狂想法吗?

最佳答案

更好的方法是即时转换您的 30 个零件,而不是在不同位置制作数千个零件的副本。您的顶点缓冲区将包含您的顶点数据的一份副本,从而节省大量内存。然后,每个帧都可以通过一组变换来表示,这些变换作为统一传递给顶点着色器,用于调用 glDrawElements() 绘制的每个骨骼。 .每个从属骨骼的变换都是相对于父骨骼构建的。然后,根据您想要动画的手工制作和程序生成之间的连续统一体的哪个位置,您的变换集可能会占用或多或少的空间和 CPU 计算时间。

Jason L. McKesson 的免费书籍,Learning Modern 3D Graphics Programming , 在第 6 章中很好地解释了如何完成此操作。本章末尾的示例程序显示了如何使用矩阵堆栈来实现分层模型。 I have an OpenGL ES 2.0 on iOS port of this program available .

关于opengl-es - 在 OpenGL ES 中优化骨骼动画的顶点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13069809/

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