首先。你得保证你的线性代数的功底是OK的。
然后,不管OK不OK,继续看吧。( /滑稽 )
GLM
- 在OpenGL中没有自带的运算方式,所以我们要使用GLM这个库。
- 使用方法:
- 点击下载GLM9.8版本或者在visual studio的NuGet包管理工具中下载并安装9.8.5版本
- 点击"Alt + Enter"键,在" C/C++ "列表中选择" 常规 ",点击附加包含目录,添加glm的目录即可
- 引入
#include<glm/glm.hpp>
#include<glm/gtc/matrix_transform.hpp>
#include<glm/gtc/type_ptr.hpp>
/* 大多数功能都可以在这三个头文件中找到 */
一起来愉快的与线代玩耍
首先做一个小小的操作:把一个向量(1,0,0)位移(1,1,0)个单位( 注意,我们把它定义为一个glm::vec4类型的值,齐次坐标定为1.0 )。
glm::vec4(1.0f,0.0f,0.0f,1.0f);//使用GLM内建的向量类定义一个叫做vec的向量 /* 下面就是矩阵初始化的一个例子 */ glm::mat4 trans;//定义一个mate4类型的trans,默认就是一个4*4的矩阵 trans = glm::translate(trans,glm::vec3(1.0f,1.0f,0.0f));//创建一个变换矩阵,把一个矩阵和一个单位向量传递给glm::translate vec = trans * vec; //矩阵相乘 cout<<vec.x<<vec.y<<vec.z<<endl;
然后做一个大操作。把上次渲染出来的正方形逆时针旋转90度再缩放0.5倍。
/* 创建变换矩阵 */ glm::mat4 trans; /* GLM希望角度是弧度制的,所以使用glm::rotate将角度转化为弧度,下一个参数是绕着哪一个方向向量旋转 */ trans = glm::rotate(trans,glm::radians(90.0f),glm::vec3(0.0,0.0,1.0)); trans = glm::scale(trans,glm::vec3(0.5,0.5,0.5));
下一个大问题如何把矩阵传递给着色器。GLSL里有一个mat4类型,所以我们可以修改顶点着色器让其接收一个mat4的uniform变量,然后再用矩阵uniform乘位置向量
#version 330 core layout(location = 0) in vec3 aPos; layour(location = 1) in vec2 aTexCoord; out vec2 TexCoord; uniform mat4 transform; void main(){ gl_Position = transform * vec4(aPos, 1.0f); TexCoord = vec2(aTexCoord.x, 1.0 - aTexCoord.y); }
然后把变换的矩阵传递给着色器
unsigned int transformLoc = glGetUniformLocation(shader.ID,"transform"); //查询uniform的位置 glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(trans)); //把矩阵发送给着色器 /* 第一个参数是uniform的位置,第二个参数是矩阵的数量,第三个参数表名是否需要行列交换,第四个参数是真正的矩阵数据 */