QT与OpenGL结合实现天空盒

    之前捣鼓过一段时间opengl,用的是glad加上glfw库,由于在windows下C++开发用QT较多,所以把QT和opengl结合,因此进行了尝试。

    首先QT5.8.0下有自带的opengl控件opengl widget,将这个控件提升为一个自己写的类myOpenGlBox继承于QOpenGLWidget。

然后重载 void initializeGL(); void resizeGL(int w,int h); void paintGL();三个函数,基本可以实现在控件上绘制3D图像。由于没用QT自带的opengl函数,要用到opengl库,因此需要用glad对opengl库进行初始化。将glad.h和glad.c文件加入QT工程即可。在initializeGL()函数中调用gladLoadGL()对opengl函数进行初始化(如果在类的构造函数中调用该函数,会初始化失败)。初始化成功后就可以使用opengl中的函数进行绘制了。

初始化函数如下:

void myOpenGlBox::initializeGL()
{
    //GLenum err = glewInit();
    if(!gladLoadGL())
    {
        std::cout<<"Failed to init glad!"< faces
        {
            "F:\\QT\\OpenGLtry\\skyBox\\right.jpg",
            "F:\\QT\\OpenGLtry\\skyBox\\left.jpg",
            "F:\\QT\\OpenGLtry\\skyBox\\top.jpg",
            "F:\\QT\\OpenGLtry\\skyBox\\bottom.jpg",
            "F:\\QT\\OpenGLtry\\skyBox\\front.jpg",
            "F:\\QT\\OpenGLtry\\skyBox\\back.jpg"
        };
        cubemapTexture = loadCubemap(faces);

        // shader configuration
        // --------------------
        shader->use();
        shader->setInt("texture1", 0);

        skyboxShader->use();
        skyboxShader->setInt("skybox", 0);//0表示GL_TEXTURE0
}

    首先生成cubeVAO、VBO和skyboxVAO、VBO,然后对着色器shader进行设置,准备画图。画图函数如下:

void myOpenGlBox::paintGL()
{
    // render
    // ------
    glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    // draw scene as normal
    shader->use();
    glm::mat4 model;
    glm::mat4 view = camera->GetViewMatrix();
    glm::mat4 projection = glm::perspective(glm::radians(camera->Zoom), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f);
    shader->setMat4("model", model);
    shader->setMat4("view", view);
    shader->setMat4("projection", projection);
    // cubes
    glBindVertexArray(cubeVAO);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, cubeTexture);
    glDrawArrays(GL_TRIANGLES, 0, 36);
    glBindVertexArray(0);

    // draw skybox as last
    glDepthFunc(GL_LEQUAL);  // change depth function so depth test passes when values are equal to depth buffer's content
    skyboxShader->use();
    view = glm::mat4(glm::mat3(camera->GetViewMatrix())); // remove translation from the view matrix
    //view = camera.GetViewMatrix();
    skyboxShader->setMat4("view", view);
    skyboxShader->setMat4("projection", projection);
    // skybox cube
    glBindVertexArray(skyboxVAO);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_CUBE_MAP, cubemapTexture);
    glDrawArrays(GL_TRIANGLES, 0, 36);
    glBindVertexArray(0);
    glDepthFunc(GL_LESS); // set depth function back to default
}

首先对shader中的model、view、projection的空间变换矩阵进行设置,设置完成后分别画出cube与skybox即可。运行效果如下:

源代码资源文件:https://download.csdn.net/download/qq_27736025/10808235

文章原创,转载请注明!

你可能感兴趣的:(OpenGL,Qt学习)