opengl - 骨骼动画顶点着色器的性能问题

标签 opengl glsl lwjgl

我的骨骼动画顶点着色器遇到问题。当同时制作大约 32 个模型的动画时,我只能获得 60 fps,而在低端计算机上,我获得的速度甚至更低。下面的顶点着色器:

uniform mat4 boneMatrixes[128];

void main(){

  vec4 a = gl_Vertex;

  // Apply bone transformation
  a = boneMatrixes[int(gl_Normal.x)] * gl_Vertex;

  gl_Position = gl_ModelViewProjectionMatrix * a;
  gl_TexCoord[0] = gl_MultiTexCoord0;

}

参数是这样绑定(bind)的(请注意,这是Java,我使用的是LWJGL OpenGL绑定(bind):)

int boneMatrixesName = ARBShaderObjects.glGetUniformLocationARB(mProgramShader, "boneMatrixes");

// matrixFloatBuffer is a FloatBuffer of size 128 * 16
ARBShaderObjects.glUniformMatrix4ARB(boneMatrixesName, false, matrixFloatBuffer);

注释掉a=boneMatrixes[int(gl_Normal.x)] * gl_Vertex; 生产线将性能提高了约 500%。如何提高该顶点着色器的性能?它看起来尽可能简单和快速。

最佳答案

根据 GPU 供应商和型号的不同,这些 128 个 4x4 矩阵可能使用多达 512 个统一组件。这是一个非常多的空间,而且很多空间都被浪费了,因为真正有用的部分是 3x4。您可能想要查看四元数作为将蒙皮信息上传到 GPU 并在着色器中将其转换为矩阵的方法。

关于opengl - 骨骼动画顶点着色器的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9983679/

相关文章:

opengl - glm 结合旋转和平移

c++ - glRotatef 移动轴

opengl - 如何将自定义 C++ 矩阵类传递给 glUniformMatrix

c++ - OpenGL 实现多 channel

java - LWJGL 程序给出错误 "no lwjgl in java.library.path",但是当我查看 list 时它就在那里

java - LWJGL 体素引擎 - VBO 上的纹理

java - 天空盒不显示纹理

c - (Linux/X11) 具有纯色背景的透明窗口上的透明 opengl 对象显示窗口后面的内容

linux - 如何在 Linux 中没有窗口管理器的情况下使用 OpenGL?

matrix - 在球体上从一点移动到另一点