OpenGL Eight (Cube)

Posted littlebanana

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenGL Eight (Cube)相关的知识,希望对你有一定的参考价值。

先画一个3D平面

  • 进行3D绘图时,我们先船舰一个模型矩阵。这个矩阵包含了位移、缩放、旋转操作,会被一共有过到所有物体的顶点上,以变换到全局的世界空间。

  • 下面的代码是把一个2D平面沿着X轴旋转90度

    • 创建模型矩阵,将顶点乘以模型矩阵,得到的顶点坐标就是经过变换到世界坐标。
    glm::mat4 model;
    mode = glm::rotate(model,glm::radians(-55.0f),glm::vec3(1,0f,1.0f,1.0f));
    • 创建观察矩阵,将观察机后移
    glm::mat4 view;
    view = glm::translate(view,glm::vec3(0.0f,.0.f,-3.0f));
    • 定义一个投影矩阵
    glm::mat4 projection;
    projection = glm::perspective(glm::radians(45.0f),800.0f/600.0f,0.1f,100.0f);
    • 更新着色器
    #version 330 core
    layout(location = 0) in vec3 aPos;
    ...
    uniform mat4 model;
    uniform mat4 view;
    uniform mat4 projection;
    
    void main(){
        gl_Position = projection * view * model * vec4(aPos,1.0);
        ...
    }
    • 将矩阵传入着色器
    int modelLoc = glGetUniformLocation(shaderProgram.ID,"model");
    glUniformMatrix4fv(modelLoc,1,GL_FALSE,glm::value_ptr(model));
    //model view projection 依次传入

    技术图片

画一个真正的正方体

  • 首先是时候更新顶点信息辽。

    太多辽所以用链接

  • 为了好玩一点,我们做一个model矩阵让立方体旋转起来

    model = glm::rotate(model,(float)glfwGetTime()*glm::radius(50.0f),glm::vec3(1.0f,1.0f,0.5f));
  • 然后使用glDrawArrays绘制立方体,但这一次总共有36个顶点

    glDrawArrays(GL_TRIANGLES,0,36);
  • 但是如果就这样绘制出来的画,有一种说不出的奇怪。所以引入一个概念叫Z缓冲

    • 深度值存储在每个片段里面(作为片段的z值),当片段想要输出它的颜色时,OpenGL会将它的深度值和z缓冲进行比较,如果当前的片段在其它片段之后,它将会被丢弃,否则将会覆盖。这个过程称为深度测试(Depth Testing),它是由OpenGL自动完成的。

    • 我们可以使用以下语句来开启深度测试这个功能

      glEnable(GL_DEPTH_TEST);
    • 因为我们使用了深度测试,我们也想要在每次渲染迭代之前清除深度缓冲(否则前一帧的深度信息仍然保存在缓冲中)

    glClear(GL_COLOR_BUFER_BIT | GL_DEPTH_BUFFER_BIT);  

    技术图片

链接撒~:Grapth main shader

以上是关于OpenGL Eight (Cube)的主要内容,如果未能解决你的问题,请参考以下文章

GLUT OpenGL Cube 拉伸错误

OpenGL Cube 奇怪的错误

C ++ OpenGL Cube未显示在屏幕上

OpenGL rubiks cube - 用鼠标旋转面部

渲染动态立方体贴图 (OpenGL)

OpenGL片段着色器不照亮场景