我遇到了我的骨骼動畫頂點着色器問題。當一次動畫大約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;
}
參數綁定像這樣(請注意,這是Java中,我使用的OpenGL LWJGL結合:)
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%。我該如何提高這個頂點着色器的性能?它看起來儘可能簡單和快速。
「註釋出」......「行可將性能提高約500%。」爲什麼這讓你感到驚訝?着色器由兩個矩陣相乘和一個副本組成。如果拿走它的一半工作量,頂點着色器運行得更快並不奇怪。另外,編譯器可以優化'boneMatrixes',所以它不必上傳矩陣數據。你需要做的是更好地定位實際問題的根源。另外,停止使用'ARBShaderObjects'。使用核心GLSL功能。 – 2012-04-02 21:12:15
@NicolBolas:我發現如果我在boneMatrixes參考(如boneMatrixes [0]或boneMatrixes [1]等等)中使用常量,它會加速到與剛剛註釋掉代碼相同的級別。你知道它爲什麼這樣做嗎? – 2012-04-03 21:43:00