首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >减少顶点缓冲区中的重复数据

减少顶点缓冲区中的重复数据
EN

Stack Overflow用户
提问于 2012-11-07 15:43:49
回答 1查看 635关注 0票数 9

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

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

有两个骨缓冲器,其中包含的位置/旋转/比例尺的骨头在任何给定的框架。

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

在着色器中,两个骨缓冲器与一个缓和值(以统一的形式传递)结合在一起,然后通过对皮肤顶点的转换,将部分呈现在正确的位置。

这表现得很好,而且比我开始的地方有了很好的改进--我计算了GPU上的所有数据,只是在x/y/u/v坐标中传递,我受到了将大量数据流到GPU每一帧的限制。

然而,有很多重复的信息。皮肤缓冲区只包含它所需的内容,每个皮肤部分有4个顶点,每个顶点都是唯一的。

当它与骨头结合时,每个骨顶点被重复4次--以匹配皮肤缓冲液。在手机上工作,这是一个痛苦的坚果,因为我的内存越来越少,它使我恼怒,有这么多的浪费。

如果只有一根骨头的话,缓冲器就是这样的。

骨缓冲液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]

我不会发布完整的着色器,因为里面有太多额外的东西(旋转和缩放工作类似):

代码语言:javascript
复制
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个属性上。

有什么办法可以缩小骨缓冲的记忆足迹吗?我有很多很多帧到一个皮肤缓冲器。

EN

回答 1

Stack Overflow用户

发布于 2012-11-13 06:05:30

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

关于你的便条。要克服16个属性的限制,可以将较小的vec2属性组合到vec4中。例如,您可以将bonePosition1bonePosition2组合成一个vec4

代码语言:javascript
复制
attribute vec4 bonePosition12;

然后在着色器里用这个方法:

代码语言:javascript
复制
vec2 bonePosition1 = vec2(bonePosition12.x,bonePosition12.y);
vec2 bonePosition2 = vec2(bonePosition12.z,bonePosition12.w);

这可能对性能有一些轻微的影响,但由于这段代码位于顶点着色器,与着色的数学相比,性能下降应该是可以忽略不计的。我使用了类似的代码来操作颜色(在片段着色器中),性能也可以。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13273099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档