gpt4 book ai didi

opengl-es - 减少顶点缓冲区中的重复数据

转载 作者:行者123 更新时间:2023-12-04 04:41:54 25 4
gpt4 key购买 nike

我一次使用 3 个顶点缓冲区(我实际上有很多,但一次只使用了 3 个)。

它们包含在着色器中混合在一起以产生所需输出的信息 - 2D 骨骼动画。

有两个骨骼缓冲区,其中包含任何给定帧处骨骼的位置/旋转/缩放。

有一个皮肤缓冲区,其中包含用于渲染纹理区域的顶点,就好像它位于世界原点 (0,0)。

在着色器中,将两个骨骼缓冲区与一个缓动值(作为制服传递)组合在一起,然后通过变换蒙皮顶点,将各个部分渲染到正确的位置。

这表现得很好,并且是对我开始的地方的一个很好的改进——我在 GPU 上计算了所有内容,并且只是传入了 x/y/u/v 坐标,我受到每帧向 GPU 传输大量数据的限制。

但是,有很多重复的信息。皮肤缓冲区只包含它需要的东西,每个皮肤部分有 4 个顶点,每个顶点都是唯一的。

但是,当它与骨骼结合时,每个骨骼顶点被复制 4 次——以匹配皮肤缓冲区。在移动设备上工作,这简直是一种痛苦,因为我的内存不足,而且有这么多的浪费让我很恼火。

如果只有 1 个骨骼,这就是缓冲区的外观。

骨缓冲液 1
[x1,y1,rot1] [x1,y1,rot1] [x1,y1,rot1] [x1,y1,rot1]
骨缓冲液 2
[x2,y2,rot2] [x2,y2,rot2] [x2,y2,rot2] [x2,y2,rot2]
皮肤缓冲液
[xA,yA,uA,vA] [xB,yB,uB,vB] [xC,yC,uC,vC] [xD,yD,uD,vD]
我不会发布完整的着色器,因为那里有太多额外的东西(旋转和缩放工作类似):

attribute vec2 bonePosition1; // x1, y1
attribute vec2 bonePosition2; // x2, y2
attribute vec2 skinPosition; // xA (or xB .. ), yA (or yB .. )
uniform float a; // Some value 0..1 depending on time
...
vec2 bonePosition = mix(bonePosition1, bonePosition2, a);
vec2 combinedPosition = skinPosition * bonePosition;

笔记;因为我主要针对 iOS(其他人也是如此,但它是最严格的),所以我知道我仅限于 16 个属性。

有没有办法缩小骨骼缓冲区的内存占用?我有很多很多帧到一个皮肤缓冲区。

最佳答案

如我所见,您需要为带有数据的缓冲区( GL_ELEMENT_ARRAY_BUFFER )绑定(bind)多个索引缓冲区( GL_ARRAY_BUFFER )。如果您能够绑定(bind) 2 GL_ARRAY_BUFFER缓冲区可能是你可以绑定(bind)一个单独的GL_ELEMENT_ARRAY_BUFFER也。我不知道这是否可以在 OpenGL ES 中实现。如果这是不可能的,您可以尝试使用整数而不是浮点数来节省内存,但我相信这不适用于骨骼平移/旋转值。

关于你的笔记。要克服 16 个属性的限制,您可以组合更小的 vec2属性到 vec4 .例如,您可以组合 bonePosition1bonePosition2合二为一vec4 :

attribute vec4 bonePosition12;

然后在着色器中以这种方式使用它:
vec2 bonePosition1 = vec2(bonePosition12.x,bonePosition12.y);
vec2 bonePosition2 = vec2(bonePosition12.z,bonePosition12.w);

这可能对性能有一些小的影响,但由于此代码在顶点着色器中,与着色器的数学相比,性能下降应该可以忽略不计。我已经使用类似的代码来操纵颜色(在片段着色器中)并且性能还可以。

关于opengl-es - 减少顶点缓冲区中的重复数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13273099/

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