我目前正在开发一个框架,可以方便地渲染大量动画模型。
一个模型被组织为一个简单的骨骼层次结构,根是躯干/骨盆,通常:
因此,作为伪代码,我目前正在渲染这样的模型:
RenderBone(Bone b, Mat4x4 currentTransform){
Mat4x4 pos = currentTransform * b.boneTransform;
SetUniform("transformation", pos);
Draw(bone.mesh);
for each Bone bc in b.children do{
RenderBone(bc, pos);
}
}
因此,对于使用具有 n 个骨骼的模型的单个演员,我需要 n 个 SetUniform(不包括设置纹理之类的东西)和 n 个绘制调用。
为了减少开销,并一次使用相同的模型渲染所有演员,我考虑切换到实例渲染。
但是,我能找到的所有信息和教程都是关于绘制立方体、球体或类似的简单对象的。我在任何地方都看不到一些关于如何使用实例绘图来渲染模型的简单易懂的信息,其中每个部分(骨骼)都需要为着色器提供不同的转换矩阵。
所以,问题是:使用glVertexAttribDivisor
orgl_InstanceID
我只能指定一个与实例相关的矩阵,而不是一个与骨骼相关的矩阵。那我该如何应用我的骨骼转换呢?
我能想到的唯一可行的解决方案是 - 我可以实例化每个骨骼,而不是实例化整个模型。从而绘制一种骨骼类型的所有实例,然后绘制另一种,等等。但是我仍然需要相对频繁地使用转换矩阵更新缓冲区,而且它是更多的家务代码。
那么这是最好的选择吗?或者,更一般地说,是否有更好的不太复杂的渲染方式?还是实例化渲染仅在与静态几何体一起使用时才真正发挥作用?