glDrawArrays上的OpenGL Segfaulting

Xce*_*led 4 c++ opengl segmentation-fault

我正在使用Code :: Blocks(C++)和MinGW在Windows上使用OpenGL制作游戏.所有的绘图和逻辑都很好,游戏运作完美.直到,突然之间,它没有.经过一段随机的时间,游戏Segfaults.与GL段错误一样,堆栈跟踪无益.我唯一得到的是segfault发生在供应商的OpenGL实现中.我已经在不同供应商的多张显卡上进行了测试,他们都是这样做的,所以问题出现在我的最后.

我通过gDEBugger运行程序并获得了相同的无用堆栈跟踪.大声笑.我也使用了GLIntercept,但没有任何东西跳出来.所以我开始以手动方式找到segfault(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();
}
Run Code Online (Sandbox Code Playgroud)

有趣的是,这段代码有一段时间了.我已经打印了所有变量的值,它们都是正确的,指针不是null,整个代码中间隔的glGetError调用总是返回NO_ERROR.坦率地说,我很茫然.

任何建议我做一些不同的事情的注意事项:我需要使用顶点数组来支持遗留(1.4)GL实现,并且我将我的数组声明为指针,以便我可以(将来)重用它们来绘制多个基元在一次(比如,排气从船上出来)

Tim*_*Tim 6

你对glDrawArrays的最后一个参数应该是4(元素数),而不是12(浮点数).

您正在尝试绘制12个元素(= 36个浮点数),并访问数组的边界.