void paintGL() override { makeCurrent(); // 设置当前OpenGL上下文 if (!m_image.empty()) { glBindTexture(GL_TEXTURE_2D, m_texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_image.cols, m_image.rows, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, m_image.data); } // 清除帧缓冲区 makeCurrent(); // 再次设置当前OpenGL上下文 glClear(GL_COLOR_BUFFER_BIT); // 渲染纹理 if (!m_image.empty()) { glEnable(GL_TEXTURE_2D); glBegin(GL_QUADS); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 0.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, -1.0f, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 0.0f); glEnd(); glDisable(GL_TEXTURE_2D); } }在播放过程中,makeCurrent(); // 再次设置当前OpenGL上下文 glClear(GL_COLOR_BUFFER_BIT);makeCurrent崩溃
时间: 2024-03-27 19:40:40 浏览: 62
可能是因为在播放过程中,程序多次调用了makeCurrent()函数,导致OpenGL上下文被多次切换,从而引起崩溃。建议在执行makeCurrent()函数前,先判断当前上下文是否已经被设置,如果已经被设置,则不需要再次设置。例如可以使用如下代码:
```c++
if (QOpenGLContext::currentContext() != this->context()) {
this->makeCurrent();
}
```
这样可以保证只有在需要切换OpenGL上下文时才会调用makeCurrent()函数,避免多次切换OpenGL上下文导致的崩溃问题。
相关问题
class MyGLWidget : public QOpenGLWidget, protected QOpenGLFunctions { Q_OBJECT public: MyGLWidget(QWidget *parent = nullptr) : QOpenGLWidget(parent) {} void setImage(cv::Mat image) { m_image = image; update(); } void stopImage(bool) {} protected: protected: void initializeGL() override { initializeOpenGLFunctions(); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // 创建并绑定纹理 glGenTextures(1, &m_texture); glBindTexture(GL_TEXTURE_2D, m_texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); } void resizeGL(int w, int h) override { glViewport(0, 0, w, h); } void paintGL() override { // 从VideoCapture对象中读取图像数据 makeCurrent(); // 设置当前OpenGL上下文 // 从VideoCapture对象中读取图像数据 // 将图像数据上传到纹理中 if (!m_image.empty()) { glBindTexture(GL_TEXTURE_2D, m_texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_image.cols, m_image.rows, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, m_image.data); } // 清除帧缓冲区 glClear(GL_COLOR_BUFFER_BIT); // 渲染纹理 if (!m_image.empty()) { glEnable(GL_TEXTURE_2D); glBegin(GL_QUADS); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 0.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, -1.0f, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 0.0f); glEnd(); glDisable(GL_TEXTURE_2D); } } private: cv::Mat m_image; GLuint m_texture{}; }; glClear(GL_COLOR_BUFFER_BIT);此处崩溃,分析原因并修改
根据代码分析,glClear(GL_COLOR_BUFFER_BIT)在paintGL()函数中被调用,可能是因为OpenGL上下文没有被正确地设置导致程序崩溃。为了避免程序崩溃,可以在调用glClear(GL_COLOR_BUFFER_BIT)之前添加makeCurrent()函数来确保OpenGL上下文被正确地设置。修改后的代码如下:
```
void paintGL() override {
makeCurrent(); // 设置当前OpenGL上下文
// 从VideoCapture对象中读取图像数据
// 将图像数据上传到纹理中
if (!m_image.empty()) {
glBindTexture(GL_TEXTURE_2D, m_texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, m_image.cols, m_image.rows, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, m_image.data);
}
// 清除帧缓冲区
makeCurrent(); // 再次设置当前OpenGL上下文
glClear(GL_COLOR_BUFFER_BIT);
// 渲染纹理
if (!m_image.empty()) {
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, -1.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 1.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
glEnd();
glDisable(GL_TEXTURE_2D);
}
}
```
Traceback (most recent call last): File "C:\Users\bin_p\Downloads\demo\demo10.py", line 60, in paintGL gl.glMultMatrixf(arm_rot) File "src\latebind.pyx", line 39, in OpenGL_accelerate.latebind.LateBind.__call__ File "src\wrapper.pyx", line 299, in OpenGL_accelerate.wrapper.Wrapper.__call__ File "src\wrapper.pyx", line 161, in OpenGL_accelerate.wrapper.PyArgCalculator.c_call File "src\wrapper.pyx", line 128, in OpenGL_accelerate.wrapper.PyArgCalculatorElement.c_call File "src\wrapper.pyx", line 114, in OpenGL_accelerate.wrapper.PyArgCalculatorElement.c_call File "src\arraydatatype.pyx", line 419, in OpenGL_accelerate.arraydatatype.AsArrayTypedSizeChecked.c_call ValueError: ('Expected 64 byte array, got 36 byte array', (1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0), None)
根据报错信息,问题出在 `demo10.py` 文件的第60行,即 `gl.glMultMatrixf(arm_rot)` 这行代码。这个报错信息告诉我们期望得到一个长度为64的字节数组(byte array),但实际上得到的只有36个字节,即 (1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0)。
这个错误通常是因为传入的参数类型不正确导致的。`glMultMatrixf()` 方法期望一个长度为64的字节数组,但是您传入了一个长度为9的元组,因此出现了上述错误。
您需要检查传入的参数类型和长度是否正确,或者在调用该方法之前将元组转换为字节数组。
阅读全文