OpenGL学习笔记(四) glm和变换

矩阵完成坐标变换

将坐标用矩阵表示,变换后的坐标矩阵可以由原坐标矩阵和变换矩阵相乘求得.所以可以用glm库实现OpenGL中的变换.

使用glm

包含头文件
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
设置变换矩阵

初始化transform矩阵

//初始化一个4x4的单位矩阵
//0.9.9及以上版本
glm::mat4 trans = glm::mat4(1.0f)
//0.9.9以下
glm::mat4 trans;

修改transform矩阵进行相应变换,可以进行复合变换

//glm::rotate()	创建一个将点绕某个轴旋转x弧度的旋转矩阵,
//第二个参数是弧度,第三个参数是旋转轴
//下面表示 绕 z轴 旋转 90度
trans = glm::rotate(trans, glm::radians(90.0f), glm::vec3(0.0, 0.0, 1.0));

//glm::scale()	创建一个缩放矩阵 
//第二个参数为缩放系数
//下面表示 x,y,z缩放到0.5倍  
trans = glm::scale(trans, glm::vec3(0.5, 0.5, 0.5)); 

//glm::translate()	创建一个平移矩阵
//第二个参数为平移坐标
//下面表示 x+1,y+1,z
trans = glm::translate(trans, glm::vec3(1.0f, 1.0f, 0.0f));
把变换矩阵传给着色器

把变换矩阵传给着色器,然后得到变换后的坐标矩阵.
需要在着色器中声明uniform变换矩阵, 在程序中为其赋值.

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoord;

out vec2 TexCoord;
//在着色器中声明uniform变量 类型mat4 表示4阶矩阵
uniform mat4 transform;

void main()
{
	//变换矩阵和原坐标矩阵相乘获得新的变换坐标矩阵
	//apos中存了原来的三维坐标
    gl_Position = transform * vec4(aPos, 1.0f);
    TexCoord = vec2(aTexCoord.x, 1.0 - aTexCoord.y);
}

//在程序中为uniform mat4 transform 赋值
//获得transform变量的location值
//有着色器类的话用下面的
int transformLoc = 
	glGetUniformLocation(shaderProgram, "ourColor");
//自己的着色器类
unsigned int transformLoc = 
	glGetUniformLocation(ourShader.ID, "transform");


//第一个参数,它是uniform的位置值。
//第二个参数告诉OpenGL我们将要发送多少个矩阵,这里是1。
//第三个参数询问我们我们是否希望对我们的矩阵进行置换(Transpose),
//也就是说交换我们矩阵的行和列。OpenGL开发者通常使用一种内部矩阵
//布局,叫做列主序(Column-major Ordering)布局。GLM的默认布局就是列主序,所以并不需要置换矩阵,我们填GL_FALSE。

//最后一个参数是真正的矩阵数据,但是GLM并不是把它们的矩阵储存为OpenGL所希望接受的那种,因此我们要先用GLM的自带的函数value_ptr来变换这些数据。	
glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(trans));
posted @ 2019-11-10 18:00  少年留不住  阅读(3049)  评论(0编辑  收藏  举报