LearnOpenGL学习笔记(五):变换

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.代码

完整的代码见这里

这里除了右下角的旋转图形,还有一个在左上角不断缩放的图形,大致如下所示:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_32925781/article/details/82925957