2010-05-31 66 views
5

我正在用OpenGL製作2D遊戲。我想通過使用VBOs加速我的紋理繪圖。帶有頂點緩衝對象的OpenGL快速紋理繪製。這是做到這一點的方式嗎?

目前我正在使用即時模式。當我旋轉和縮放紋理時,我正在生成自己的座標。我還具有四捨五入紋理角的功能,使用多邊形基元繪製這些紋理。

我在想,如果使用包含無偏移量的紋理兩邊的頂點來製作VBO,最快的方法是使用glTranslate,glScale和glRotate來移動紋理的繪製位置。然後,我可以使用相同的VBO而不更改每次繪製紋理。我只能在需要爲圓角添加座標時更改VBO。

這是最好的方法嗎?做這件事時我應該注意什麼?在現代顯卡中使用GL_TRIANGLES而不是GL_QUADS真的是最快的嗎?

謝謝你的回答。

回答

4

爲了獲得更好的性能,您不應該使用即時模式渲染,而應該使用頂點緩衝區(在CPU或GPU上)並使用glDrawArrays等方法進行繪製。通過修改紋理矩陣乘數來縮放/旋轉紋理座標不是性能問題,您只需爲整個網格設置一些較小的值。這裏最重要的瓶頸是將每個頂點數據(例如顏色,位置和紋理座標)轉移到GPU,這就是GPU上的頂點緩衝區對象可以極大地提供幫助。

如果要繪製到屏幕的網格是靜態的,也就是說,您將其設置爲一次,並且以後不需要修改(部分),則可以生成整個網格的紋理座標,包括全部角落)只有一次。您稍後可以使用紋理矩陣乘數修改整個網格的紋理座標。但是,如果要使用不同的轉換修改網格的不同部分,則必須將網格劃分爲多個部分。從你所描述的內容來看,我明白你想繪製一個圓角矩形,裏面保存着一張圖片,可以使用單個靜態網格物體(每個頂點數據的列表)來完成。

最後,GL_QUADS在現代OpenGL規範中也被棄用。無論如何,它們不提供太多功能,所以您應該將QUADS切換爲三角形或三角形條/風扇。

+0

謝謝。我設法讓VBOS爲某些行代碼工作,但不能用於紋理繪製。我還沒有線索如何去做。我試過的每件事都失敗我想我需要另一個問題。 – 2010-06-01 14:06:04

+0

你看到你的對象在你想要的位置嗎?這只是模型的不正確紋理嗎?如果您看到您的物體處於正確的位置,請記住紋理座標值就像頂點位置值一樣。從一些簡單的事情開始(不要在紋理矩陣模式下使用glTranslate等修改紋理座標),然後嘗試擴展它以實現您最終想看到的效果。 – AdilYalcin 2010-06-01 17:13:59

+0

目前它在正確的位置呈現,它只是沒有被正確渲染。它對GL_QUADS和GL_TRIANGLES都失敗。我會用我的VBO代碼提出一個新問題。 是否將重要的顏色信息添加到VBO? 「glColor」會成爲一個問題嗎? 謝謝你的回答和幫助。 – 2010-06-01 19:16:32

1

如果要使用VBO繪製紋理多邊形,則不僅需要爲頂點創建緩衝區,還需要爲紋理座標(每個頂點一個UV座標)和頂點顏色創建緩衝區(如果要執行頂點照明(如果不是,則使用glColor)。在綁定預期紋理之前使用glClientActiveTexture(GL_TEXTUREn)。在發出渲染調用之前,不要忘記對正在使用的每種緩衝區類型使用glEnableClientState()。

相關問題