启动深度测试
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);
需要从右往左阅读矩阵的乘法
代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容