第六课,OpenGL的3D坐标系统

启动深度测试

glEnable(GL_DEPTH_TEST);

启动3D深度测试,绘制的图形不会因为先后顺序改变。

模型矩阵

glm::mat4 mode = glm::mat4(1.0f);
mode = glm::rotate(mode, (float)glfwGetTime() * glm::radians(50.0f), glm::vec3(0.5f, 1.0f, 0.0f));

对模型的平移,旋转。

观察矩阵

glm::mat4 view = glm::mat4(1.0f);
view = glm::translate(view, glm::vec3(0.0f, 0.0f, -3.0f));

对摄影机的平移旋转(一般对摄影机操作的值全部取负)

投影矩阵

 glm::mat4 projection = glm::mat4(1.0f);
projection = glm::perspective(glm::radians(45.0f), (float)viewwidth / (float)viewheight, 0.1f, 100.0f);

正视投影

glm::ortho(,,,,,);

透视投影

glm::mat4 proj = glm::perspective
	(glm::radians(视锥上下面之间的夹角), 视窗的宽/, 近截面的深度,远界面的深度);

将矩阵传入渲染管线

PVPCShader.setMat4(“mode”, mode);
PVPCShader.setMat4(“view”, view);
PVPCShader.setMat4(“projection”, projection);

管线

uniform

uniform mat4 mode = {{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}};
uniform mat4 view = {{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}};
uniform mat4 projection = {{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}};

初始化变量,防止对其他渲染的影响。

图形变换

在这里插入图片描述
gl_Position = projection * view * mode * vec4(aPos, 1.0);//顺序一定不能错
如果将view和mode的顺序颠倒,将先转变为摄像机视角,再对图形做变化。

重点

注意矩阵运算的顺序是相反的(记住我们需要从右往左阅读矩阵的乘法)。最后的顶点应该被赋值到顶点着色器中的gl_Position,OpenGL将会自动进行透视除法和裁剪。

例如在如下程序中

for (unsigned int i = 0; i < 10; i++){
	float angle = 20.0f * i;
	mode = glm::mat4(1.0f);//**1**
	mode = glm::translate(mode, cubePositions[i]);//**2**
	mode = glm::rotate(mode, (float)glfwGetTime() * glm::radians(50.0f), glm::vec3(0.5f, 1.0f, 0.0f));//**3**
	mode = glm::rotate(mode, glm::radians(angle), glm::vec3(1.0f, 0.3f, 0.5f));//**4**
}

在数学逻辑(从左向右计算)上有:
mode = 4(自身旋转) * 3(按时间轴旋转) * 2(移动一定距离) * 1(单位矩阵)
在glsl语言中

gl_Position =   projection * view * mode * vec4(aPos, 1.0);

需要从右往左阅读矩阵的乘法

代码

摘自LearnOpenGL CN

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片