LearnOpenGL学习笔记(五)
1.准备工作
OpengGL中对物体的变换是通过矩阵对象来实现的,需要掌握一些最基本的矩阵运算相关知识。
要在OpenGL中使用矩阵,需要用到一个第三方库GLM(OpenGL Mathematics),它是一个只有头文件的库(这里下载,我选择的是0.9.8的版本)。我们需要的GLM的大多数功能都可以从下面这3个头文件中找到:
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
我们需要定义顶点着色器,使能够接收一个mat4的uniform矩阵,通过变换矩阵左乘位置向量,就可以实现对图形的变换。
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoord;
out vec2 TexCoord;
uniform mat4 transform;
void main()
{
gl_Position = transform * vec4(aPos, 1.0f);
TexCoord = vec2(aTexCoord.x, aTexCoord.y);
}
然后在渲染循环中,我们需要加入如下语句以定义我们的变换矩阵,注意代码中的定义顺序与实际效果的顺序是相反的(线性代数知识)。
//定义一个四维的单位矩阵
glm::mat4 transform;
//再位移,实际运行顺序与程序顺序相反
transform = glm::translate(transform, glm::vec3(0.5f, -0.5f, 0.0f));
//先旋转
transform = glm::rotate(transform, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));
最后设置好uniform:
//设置Uniform
ourShader.use();
unsigned int transformLoc = glGetUniformLocation(ourShader.ID, "transform");
//Matrix4fv函数把矩阵数据发送给着色器。参数依次是uniform的位置值、矩阵个数,是否希望置换以及矩阵数据
glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(transform));
完成之后就可以渲染我们的容器了。
2.代码
完整的代码见这里
这里除了右下角的旋转图形,还有一个在左上角不断缩放的图形,大致如下所示: