2011-12-23 63 views
2

假設我有以下代碼:glMultMatrix/glLoadMatrix比glRotatef或glTranslatef更高效嗎?

glRotatef(angle, 1.0f, 1.0f, 0.0f); 
glRotatef(angle, 0.0f, 1.0f, 0.0f); 
glRotatef(angle, 0.0f, 0.0f, 1.0f); 
glTranslatef(0.0f, 0.0f -5.0f); 

這是不是通過這完成相同功能的glLoadMatrix功能使用自己定製的矩陣效率不高?

此外,我知道當矩陣相乘形成一個自定義的線性變換時,最後一個矩陣相乘是第一次變換髮生。同樣,如果我使用上面的代碼,情況就是這樣嗎?它會平移,然後圍繞Z軸旋轉,然後圍繞Y軸和X軸旋轉?

回答

6

一般情況下,如果你自己組裝你的矩陣並通過glLoadMatrix或glMultMatrix加載它,你的程序運行得更快。除非你在你自己的矩陣例程中犯了愚蠢的錯誤,這會破壞當然的性能。

這是因爲glRotate glTranslate等函數比純數學做得多一點。他們必須檢查矩陣模式。 glRotate必須處理軸不能作爲單位向量傳遞的情況。

但是除非你每幀執行這個萬次,否則我不會擔心失去的性能。它加起來,但並不多。

我個人處理openGL轉換的方法是在我的代碼中構建矩陣,並只通過glLoadMatrix將它們上傳到OpenGL。這使我可以完成許多快捷操作,例如顛倒乘法順序(比OpenGL更快)。如果您想在渲染之前進行邊界框檢查,它還能讓我立即訪問所需的矩陣。

不用說寫這樣一種方法的代碼也更容易移植到不同的圖形API(OpenGL的思考| ES2,以及對DirectX遊戲,遊戲機...)

3

據了OpenGL規格的glRotate和glTranslate使用它們的參數來生成4x4矩陣,然後將當前矩陣乘以(glRotate或glTranslate)生成的矩陣,產品替換當前矩陣。

這大致意味着您的入圍代碼中有4個矩陣乘法!最重要的是,您有4個API調用和一些其他計算,可將glRotate的角度轉換爲4x4矩陣。

通過使用glLoadMatrix,您將不得不自己生成轉換矩陣。有了角度和平移,就有了更有效的方法來生成變換矩陣,從而加速整個事情。

2

這是否比通過完成相同功能的glLoadMatrix函數利用自己的自定義矩陣效率更低?

很有可能。但是,如果您遇到轉換矩陣設置已成爲瓶頸的情況,那麼您正在做一些根本性錯誤。在一個合理編寫的實時圖形程序中,轉換矩陣的計算應該只佔總處理量的很小一部分。

一種非常不好的編程的例子是這樣的(僞):

glMatrixMode(GL_MODELVIEW) 
for q in quads: 
    glPushMatrix() 
    glTranslatef(q.x, q.y, q.z) 
    glBindTexture(GL_TEXTURE_2D, q.texture) 
    glBegin(GL_QUADS) 
    for v in [(0,0), (1,0), (1,1), (0,1)]: 
     glVertex2f(v[0], v[1] 
    glEnd() 
    glPopMatrix() 

這樣的代碼會執行得非常糟糕。首先,您需要花費大量時間計算每個四元組的新轉換矩陣,然後重新啓動每個四元組的原始批處理,紋理開關會終止緩存,並最後使用即時模式。事實上,上面的代碼是一個例子中最糟糕的OpenGL反模式。

提高渲染性能的最佳方法是避免在上例中可以看到的任何模式。

1

這些矩陣函數在驅動程序中實現,所以它們可能會被優化。您將不得不花費一些時間編寫自己的代碼,並測試性能是否比原始OpenGL代碼更好或不好。

另一方面,在「新」版本的OpenGL中,所有這些功能都缺失並被標記爲已棄用。因此,在新標準中,您不得不使用自定義數學函數(假設您正在使用核心配置文件)

相關問題