我正在使用 Code::Blocks (C++) 和 MinGW 在 Windows 上的 OpenGL 中制作游戏。所有的绘图和逻辑都很好,游戏完美运行。直到,突然,它没有。一段时间后,游戏Segfaults 。与 GL 段错误一样,堆栈跟踪是无用的。我得到的唯一一件事是段错误发生在供应商的 OpenGL 实现中。我已经在来自不同供应商的多个显卡上对此进行了测试,他们都这样做了,所以问题出在我这边。
我通过 gDEBugger 运行了程序,得到了同样无用的堆栈跟踪。哈哈。我也使用了 GLIntercept,但没有任何反应。因此,我着手以手动方式查找段错误(BuGLe 拒绝编译...),并且基本上将跟踪消息写入日志。我已将其范围缩小为对 glDrawArrays 的一次调用。我在互联网上做了很多探索,并尝试了很多我发现的修复程序。
因为这个游戏没有为可移植性而编码,所以我一直犹豫要在 wine 和 valgrind 中运行它。在我弄乱那个美妙的混乱之前,如果您能查看我的代码并找到错误,我将不胜感激。(我敢肯定这是显而易见的......)
(注意:为了便于阅读,我删除了所有的跟踪线)
void PlayerShip::Render()
{
glPushMatrix(); //Save the current state
glTranslatef(m_PosX, m_PosY, 0);
glRotatef(vect.Rotation - 90, 0, 0, 1); //Matrixes are applied in reverse order
double xl = m_SizeX / 2, yl = m_SizeY / 2; //Get values to add/subract to the midpoint for the corners
glEnable(GL_TEXTURE_2D); //Redundant
TextureManager::Inst()->BindTexture(TexIDs::Playership01); //Bind the texture
glEnableClientState(GL_VERTEX_ARRAY); //These enables and disables are redundant here
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
GLdouble* Verts;
Verts = new GLdouble[12] { -xl, -yl, -.5, xl, -yl, -.5,
xl, yl, -.5, -xl, yl, -.5}; //Calculate quad vertices
GLdouble* Texs;
Texs = new GLdouble[8] {0, 0, 1, 0, 1, 1, 0, 1}; //Calculate texture vertices
glVertexPointer(3, GL_DOUBLE, 0, Verts);
glTexCoordPointer(2, GL_DOUBLE, 0, Texs);
glDrawArrays(GL_QUADS, 0, 12);
delete [] Verts;
delete [] Texs;
glPopMatrix();
}
有趣的是,这段代码可以工作......一段时间。我已经打印了所有变量的值,它们都是正确的,指针不为空,在整个代码中间隔的 glGetError 调用总是返回 NO_ERROR。坦率地说,我很茫然。
给任何建议我做一些不同事情的人的说明:我需要使用顶点数组来支持旧版 (1.4) GL 实现,并且我将我的数组声明为指针,以便我可以(将来)重用它们来绘制多个图元有一次(比如说,从船上排出废气)