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);
以上是关于OpenGL Eight (Cube)的主要内容,如果未能解决你的问题,请参考以下文章