gpt4 book ai didi

c++ - glDrawArrays 上的 OpenGL 段错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:38:27 24 4
gpt4 key购买 nike

我正在使用 Code::Blocks (C++) 和 MinGW 在 Windows 上的 OpenGL 中制作游戏。所有的绘图和逻辑都很好,游戏运行完美。直到,突然间,它没有。经过一段随机时间后,游戏出现段错误。与典型的 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 实现,并且我将我的数组声明为指针,以便我可以(将来)将它们重用于一次绘制多个图元(例如,从船中排出废气)

最佳答案

glDrawArrays 的最后一个参数应该是 4(元素数),而不是 12( float )。

您正在尝试绘制 12 个元素(= 36 个 float ),并越过数组的边界进行访问。

关于c++ - glDrawArrays 上的 OpenGL 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10645484/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com