2011-02-28 36 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