为啥点击窗口外的地方或者窗口大小发生变化后,绘制好的图形会消失只剩下背景?
相关代码如下:
void OpenGLWidget::initializeGL()
{
initializeOpenGLFunctions();
f = QOpenGLContext::currentContext()->functions();
f->glEnable(GL_DEPTH_TEST);
//初始化着色器
this->initializeShaders();
}
void OpenGLWidget::initializeShaders()
{
this->m_ModelShader = new QOpenGLShaderProgram(this);
if (!m_ModelShader->addShaderFromSourceFile(QOpenGLShader::Vertex, \
ModelvertexShaderPath))
qDebug() << "Failed to load Vert shader:" << m_ModelShader->log();
if (!m_ModelShader->addShaderFromSourceFile(QOpenGLShader::Fragment, \
ModelfragmentShaderPath))
qDebug() << "Failed to load fragment shader:" << m_ModelShader->log();
if (!m_ModelShader->link())
std::cout << "ERROR: failed to link: " << m_ModelShader->log().toStdString();
}
}
void OpenGLWidget::paintGL()
{
f = QOpenGLContext::currentContext()->functions();
f->glClearColor(0.0f, 0.5f, 0.7f, 1.0f);
f->glEnable(GL_DEPTH_TEST);
f->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
this->DrawModelData();
m_ModelShader->bind();
this->setModelShaderMatrix();
// 绘制
m_VAO.bind();
m_EBO.bind();
f->glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);
// 解绑着色器程序
m_VAO.release();
m_ModelShader->release();
m_VAO.destroy();
m_VBO.destroy();
m_EBO.destroy();
glDisable(GL_DEPTH_TEST);
}
void OpenGLWidget::DrawModelData()
{
this->m_ModelShader->bind();
/*--------------------------初始化------------------*/
if (!m_VAO.create())
std::cerr << "ERROR: faild to create vertex array object" << std::endl;
if (!m_VBO.create())
std::cerr << "ERROR: failed to create vertex buffer object" << std::endl;
if (!m_EBO.create())
std::cerr << "ERROR: failed to create index buffer object" << std::endl;
/*-------------------顶点数组绑定------------------*/
m_VAO.bind();
if (!m_VBO.bind())
{
std::cerr << "ERROR: failed to bind vertex buffer object" << std::endl;
}//将与该对象相关联的缓存绑定到当前OpenGL环境
m_VBO.allocate(&meshes[0], meshes.size() * sizeof(Vertex));
if (!m_EBO.bind())
{
std::cerr << "ERROR: failed to bind index buffer object" << std::endl;
}
m_EBO.allocate(&indices[0], sizeof(unsigned int) * indices.size());
int vertexLocation = m_ModelShader->attributeLocation("aPos"); // 位置属性的位置为 0
int normalLocation = m_ModelShader->attributeLocation("aNormal"); // 法线属性的位置为 1
this->m_ModelShader->enableAttributeArray(vertexLocation);
this->m_ModelShader->setAttributeBuffer(vertexLocation, GL_FLOAT, offsetof(Vertex, Position), 3, sizeof(Vertex));
this->m_ModelShader->enableAttributeArray(normalLocation);
this->m_ModelShader->setAttributeBuffer(normalLocation, GL_FLOAT, offsetof(Vertex, Normal), 3, sizeof(Vertex));
m_VBO.release();
m_EBO.release();
m_VAO.release();
m_ModelShader->release();
}