我知道要正确初始化和使用任何 Qt OpenGL 便利类,必须使用有效的当前上下文调用它们。因此,我将我的类设计为从我的重载QOpenGLWidget::initializeGL()
函数初始化,其中文档说明上下文已创建并成为当前的(尽管没有帧缓冲区)。
但是,当initializeGL()
尝试初始化我的一个子类MeshObject
,特别是调用函数QOpenGLVertexArrayObject::create()
时,程序崩溃并显示消息
Read access violation at 0x0
通过调试器,注意调用堆栈:
有对 QPainter::drawImage 的调用,这肯定会失败,因为没有帧缓冲区存在。
但是为什么QPainter::drawImage
当我尝试创建一个 vertexArrayObject 时会发生调用?当然,这个功能不应该涉及到屏幕上的绘画。
虽然文档还指出 QOpenGLVertexArrayObjects 只能在某些 OpenGL ES 2.0 平台上运行,但vbuffer.create()
会导致完全相同的情况发生,而且我已经QOpenGLVertexArrayObjects
在之前的项目中使用过这台机器,完全没有问题。
完整的堆栈跟踪:
0 QPainter::drawImage Qt5Guid 0x58292a56
1 QPainter::drawImage Qt5Guid 0x5829203c
2 MeshState::initBuffers meshobject.cpp 71 0x2fb793
3 SceneObject::setupObjects sceneobject.cpp 18 0x2fa1eb
4 SceneObject::initialize sceneobject.cpp 12 0x2fa12f
5 OpenGLWidget::initializeGL openglwidget.cpp 34 0x2f8ecf
6 QAbstractScrollArea::setHorizontalScrollBar Qt5Widgetsd 0x587a9859
7 QAbstractScrollArea::setHorizontalScrollBar Qt5Widgetsd 0x587a86da
8 QAbstractScrollArea::setHorizontalScrollBar Qt5Widgetsd 0x58770104
9 QAbstractScrollArea::setHorizontalScrollBar Qt5Widgetsd 0x587a8850
10 QAbstractScrollArea::setHorizontalScrollBar Qt5Widgetsd 0x5872548e
11 QAbstractScrollArea::setHorizontalScrollBar Qt5Widgetsd 0x587235f5
12 QSortFilterProxyModel::mapToSource Qt5Cored 0x591b6b47
13 QSortFilterProxyModel::mapToSource Qt5Cored 0x591bf379
14 QAbstractScrollArea::setHorizontalScrollBar Qt5Widgetsd 0x5877a3a3
15 QAbstractScrollArea::setHorizontalScrollBar Qt5Widgetsd 0x5877a618
16 QAbstractScrollArea::setHorizontalScrollBar Qt5Widgetsd 0x5876be41
17 QAbstractScrollArea::setHorizontalScrollBar Qt5Widgetsd 0x5876c0bb
18 QAbstractScrollArea::setHorizontalScrollBar Qt5Widgetsd 0x58779441
19 QAbstractScrollArea::setHorizontalScrollBar Qt5Widgetsd 0x5877a62e
20 QAbstractScrollArea::setHorizontalScrollBar Qt5Widgetsd 0x5876be41
21 QAbstractScrollArea::setHorizontalScrollBar Qt5Widgetsd 0x5876c0bb
22 main main.cpp 10 0x2f3419
23 WinMain qtmain_win.cpp 113 0x2fdcdd
24 __tmainCRTStartup crtexe.c 618 0x2fd0bf
25 WinMainCRTStartup crtexe.c 466 0x2fce7d
26 BaseThreadInitThunk KERNEL32 0x772e38f4
27 __RtlUserThreadStart ntdll 0x77865de3
28 _RtlUserThreadStart ntdll 0x77865dae