我正在制作一个WebGL游戏并最终提出了一个非常方便的对象模板概念,当同类型的游戏对象(比如同一种族的角色)使用相同的模板时(这意味着:缓冲区) ,属性和着色器程序),并通过指定一组制服(实际上是同类对象之间最常见的差异:模型矩阵,纹理,骨骼位置等)从该模板实例化。为了使用自己的缓冲区深层副本创建独立对象,我只需对原始模板进行深层复制并重新初始化,然后从中开始实例化新对象。
但在那之后我开始怀疑。比方说,如果我开始在对象上使用变形,通过显式编辑顶点,这种方法将要求我为这种类型的每个对象创建一个单独的模板(否则,它们将开始在完全相同的阶段变形)。对于这种情况,这可能很好,因为我很可能需要重新计算法线甚至纹理坐标,这意味着 - 大多数缓冲区。
但是,如果我遗漏了一些非常常见的使用属性的情况,比如血液贴花,这将要求我只更新一小块缓冲区?在这种情况下,为每个对象提供两个缓冲区将更加合理:一个由它们共享的共同缓冲区和一个用于血液贴花的缓冲区,这对于每个对象都是唯一的。而且,由于血液通常洒在一切上,这听起来很合理,因此我们可以通过存储顶点,法线等来节省大量空间,而不会造成不必要的重复。
我还没有尝试过实现贴花,所以老实说甚至不确定使用顶点绘画(纹理或非纹理)实现它们是正确的选择。但我也很确定除了顶点,法线和纹理坐标之外还有一些常用的属性。
以下是我自己想出的一些内容:
有什么想法吗?
UPD:因为这一切听起来很混乱,我想澄清一点:我确实理解使用尽可能少的缓冲区是件好事,这正是我试图使用这个模板概念的原因。我的问题是:对于模板使用单个缓冲区和单个元素缓冲区(两者都在类似对象之间共享)的可能情况是什么?我会在后面刺伤我?答案 0 :(得分:2)
保留卡上不会发生变化的大量数据对于节省带宽非常有用。此外,一旦它们在卡上,您可能不会直接更改顶点位置。相反,您可能会通过Skeletal动画在Vertex着色器中传递制服来变形它们。在此处阅读:Skeletal Animation
请记住,在带有网格的关键帧动画中,会在卡片上保留一堆缓冲区,每个缓冲区都在动画的不同关键帧姿势中。但是,您可以将要插入的任何两个关键帧作为属性加载,然后在它们之间进行混合(您可以有两个以上)。 Keyframe Animation
此外,随着转换反馈的引入,(不,你没有在WebGL中使用它,它成为OpenGL 3.0的核心,WebGL基于OpenGL ES 2.0,它基于OpenGL 2.0)你可以开始保持计算数据GPU方面。换句话说,您可以在顶点或几何着色器中进行巨型粒子系统模拟,然后将计算出的数据存储到另一个缓冲区中,然后在下一帧中使用该缓冲区,而无需从GPU到CPU 在此处阅读:Transform Feedback和此处:Transform Feedback how to
一般情况下,您不希望在卡上出现缓冲区,尤其是每一帧。而是加载多个并在着色器中使用指向该数据的指针作为属性。