之前捣鼓过一段时间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
文章原创,转载请注明!