【问题标题】:OpenGL Alternative for Drawing Textures with Immediate Mode?使用立即模式绘制纹理的 OpenGL 替代方案?
【发布时间】:2011-02-28 00:29:05
【问题描述】:

我正在编写一个简单的图形引擎,它使用 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是一个向量,存储了精灵的x和y位置,m_size存储了精灵的大小。

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

谁能给我任何关于如何使用我上面描述的实现来加速这项技术的性能的指示(不是双关语)?还有什么我可能做错了吗? (我对 OpenGL 和图形编程比较陌生。)

提前致谢!

【问题讨论】:

    标签: c++ opengl graphics 2d


    【解决方案1】:

    您正在使用即时模式,目前在严肃的 3D 图形编程中很少使用(如果有的话)。事实上,在使用 OpenGL ES(1.1 和 2.0)的移动设备上,它甚至不可用。

    至少,你应该使用顶点数组,它们是使用glVertexPointerglNormalPointerglColorPointerglTexCoordPointer设置的,然后使用glDrawArraysglDrawElements绘制。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多