2012-04-02 84 views
2

我遇到了我的骨骼動畫頂點着色器問題。當一次動畫大約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%。我該如何提高這個頂點着色器的性能?它看起來儘可能簡單和快速。

+2

「註釋出」......「行可將性能提高約500%。」爲什麼這讓你感到驚訝?着色器由兩個矩陣相乘和一個副本組成。如果拿走它的一半工作量,頂點着色器運行得更快並不奇怪。另外,編譯器可以優化'boneMatrixes',所以它不必上傳矩陣數據。你需要做的是更好地定位實際問題的根源。另外,停止使用'ARBShaderObjects'。使用核心GLSL功能。 – 2012-04-02 21:12:15

+0

@NicolBolas:我發現如果我在boneMatrixes參考(如boneMatrixes [0]或boneMatrixes [1]等等)中使用常量,它會加速到與剛剛註釋掉代碼相同的級別。你知道它爲什麼這樣做嗎? – 2012-04-03 21:43:00

回答

2

根據GPU供應商和型號,這128個4x4矩陣可能會使用多達512個統一組件。這是非常可怕的,同時也浪費了很多空間,因爲實際上有用的部分是3x4。您可能希望查看四元數作爲向GPU上傳蒙皮信息並將其轉換爲着色器中的矩陣的方法。

+0

出於興趣,將骨骼矩陣作爲制服發送通常做的事情,還是有辦法用第二個頂點流來做呢?我想我在某個地方讀過這篇文章,但我忘記了細節。:-(。 – Robinson 2012-04-02 21:57:27