用于立即模式绘制纹理的OpenGL替代方案?

dka*_*ich 5 c++ opengl graphics 2d

我正在编写一个简单的图形引擎,使用OpenGL和C++在屏幕上绘制纹理.我绘制纹理的方式是使用下面的源代码 - 绘图是在我编写的"Sprite"类中包含的方法中完成的,该类由主场景的游戏循环调用.

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);
Run Code Online (Sandbox Code Playgroud)

m_textureID是已经用OpenGL加载的纹理的id,m_pos是存储sprite的x和y位置的向量,m_size存储sprite的大小.

我发布这个的原因是因为我从熟悉OpenGL的人那里听说这是在屏幕上绘制许多不同纹理的错误方法.显然,如果屏幕上同时有很多图形,那么在调用glVertex时使用glBegin(GL_QUADS)和glEnd()可能会很慢,并且正确的方法是使用顶点指针.

任何人都可以使用我上面描述的实现给我任何关于如何加速这种技术性能的指针(没有双关语)?还有什么我可能做错了吗?(我对OpenGL和图形编程比较陌生.)

提前致谢!

Mar*_*tos 7

您正在使用立即模式,这些日子在严肃的3D图形编程中使用不多(如果有的话).实际上,在使用OpenGL ES(1.1和2.0)的移动设备上,它甚至都不可用.

最起码,你应该使用顶点数组,其设置使用glVertexPointer,glNormalPointer,glColorPointerglTexCoordPointer,然后绘制使用glDrawArraysglDrawElements.

下一个步骤是通过经由使用顶点缓冲对象(维也纳各组织)到您的顶点数据推入GPU存储器glGenBuffer,glBindBufferglBufferData.您可以在此处此处找到示例代码.