假设我有 2 个物种,例如人类和小马。它们具有不同的骨骼系统,因此每个物种的统一骨骼阵列必须有所不同。我是否必须实现两个单独的着色器程序才能正确渲染每个骨骼数组,或者是否有办法动态声明统一数组并迭代该动态数组?
牢记性能(所有着色器在决策分支方面都很糟糕)。
在 OpenGL 4.3 之前,GLSL 中的数组必须具有固定的编译时大小。 4.3 允许使用着色器存储缓冲区对象,这允许它们的最终长度“无界”。基本上,你可以这样做:
buffer BlockName
{
mat4 manyManyMatrices[];
};
OpenGL会根据你的使用方式在运行时计算出这个数组中有多少个矩阵glBindBufferRange。所以你仍然可以使用manyManyMatrices.length()
获取长度,但它不会是编译时常量。
但是,此功能(在进行本次编辑时)非常新,并且仅在测试版中实现。它还需要 GL 4.x 级硬件(又名:Direct3D 11 级硬件)。最后,由于它使用着色器存储块,因此访问数据可能比人们希望的要慢。
因此,我建议您只使用具有最大数量矩阵的统一块。如果这成为内存问题(不太可能),那么您可以根据数组大小拆分着色器或使用着色器存储块或其他方式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)