• 430阅读
  • 0回复

[提问]QOpenGLWidget相关 [复制链接]

上一主题 下一主题
离线nanjofish
 

只看楼主 倒序阅读 楼主  发表于: 2023-09-04
为啥点击窗口外的地方或者窗口大小发生变化后,绘制好的图形会消失只剩下背景?
相关代码如下:
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();
}
快速回复
限100 字节
 
上一个 下一个