2011-02-28 88 views
4

我正在寫一個簡單的圖形引擎,使用OpenGL和C++在屏幕上繪製紋理。我繪製紋理的方式是使用下面的源代碼 - 繪圖是在我寫的「Sprite」類中包含的方法中完成的,該方法由主場景的遊戲循環調用。用於繪製立即模式紋理的OpenGL替代方法?

glEnable(GL_TEXTURE_2D); 

glBindTexture(GL_TEXTURE_2D, m_textureID); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

glColor3f(1.0f, 1.0f, 1.0f); 
glBegin(GL_QUADS); 

glTexCoord2f(0.0f, 0.0f); 
glVertex2f(m_pos.x, m_pos.y); 
glTexCoord2f(1.0f, 0.0f); 
glVertex2f(m_pos.x + m_size.x, m_pos.y); 
glTexCoord2f(1.0f, 1.0f); 
glVertex2f(m_pos.x + m_size.x, m_pos.y + m_size.y); 
glTexCoord2f(0.0f, 1.0f); 
glVertex2f(m_pos.x, m_pos.y + m_size.y); 

glEnd(); 

glDisable(GL_TEXTURE_2D); 

m_textureID是已經載入用OpenGL紋理的id和m_pos是存儲的x和子畫面的y位置的矢量,並且m_size存儲子畫面的大小。

我發佈這個的原因是因爲我從熟悉OpenGL的人那裏聽說,這是在屏幕上繪製許多不同紋理的錯誤方法。顯然,如果屏幕上同時存在許多圖形,使用glBegin(GL_QUADS)和glEnd()來調用glVertex可能會很慢,並且正確的方法是使用頂點指針。

任何人都可以給我任何指針(沒有雙關語意圖)如何加快這種技術的表現,使用我上面描述的實現?還有什麼我可能做錯了嗎? (我對OpenGL和圖形編程比較陌生。)

在此先感謝!

回答

7

您正在使用即時模式,目前在嚴肅的3D圖形編程中使用得並不多(如果有的話)。事實上,在搭載OpenGL ES(1.1和2.0)的移動設備上,它甚至不可用。

最起碼,你應該使用頂點數組,其設置使用glVertexPointerglNormalPointerglColorPointerglTexCoordPointer,然後繪製使用glDrawArraysglDrawElements

下一步是通過使用頂點緩衝對象(VBOs)通過glGenBuffer,glBindBufferglBufferData將頂點數據推送到GPU內存中。您可以找到示例代碼herehere