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

时间:2011-02-28 00:29:05

标签: 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);

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

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

任何人都可以使用我上面描述的实现方式向我提供有关如何加快此技术性能的任何指示(没有双关语)?还有什么我可能做错了吗? (我对OpenGL和图形编程比较陌生。)

提前致谢!

1 个答案:

答案 0 :(得分:7)

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

至少,您应该使用顶点数组,这些数组使用glVertexPointerglNormalPointerglColorPointerglTexCoordPointer进行设置,然后使用{{1 }或glDrawArrays

下一步是通过glDrawElementsglGenBufferglBindBuffer使用顶点缓冲区对象(VBO)将顶点数据推送到GPU内存中。您可以找到示例代码herehere