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));


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM