矩陣完成坐標變換
將坐標用矩陣表示,變換后的坐標矩陣可以由原坐標矩陣和變換矩陣相乘求得.所以可以用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));