1. 程式人生 > ><五>初探opengl,變換我們的圖形

<五>初探opengl,變換我們的圖形

mat tran 紋理 lfw targe src 例如 com lan

  這節主要是對我們的紋理矩形進行一下變換,例如縮放,旋轉,中間需要運用到一些線性代數的東西這裏就不再闡述,因為我自己也不怎麽會。。。我們直接介紹代碼怎麽寫吧。

  矩陣的相乘是從右往左讀取的,這點提醒一下自己。

  

GLM

  代碼中大部分的矩陣處理信息都是通過glm庫來處理的,全稱OPENGL MATHEMATICS ,去這裏下載,把glm文件夾放到工程的include下即可。代碼i引入文件庫

#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>

我們嘗試一下把圖案先逆時針旋轉90度,然後縮放0.5倍,代碼可以這麽寫:

glm::mat4 trans = glm:mat4(1.0f); //初始化為4*4都是1.0f的矩陣
trans = glm::rotate(trans, glm::radians(90.0f), glm::vec3(0.0, 0.0, 1.0)); //繞著z軸逆時針旋轉90度
trans = glm::scale(trans, glm::vec3(0.5, 0.5, 0.5)); //縮放為0.5

此刻trans就是包含這2個變換的矩陣了,我們把他乘以頂點就可以得到變換後的矩陣

頂點著色器修改為:

#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, 1.0 - aTexCoord.y); }

然後我們需要從代碼裏傳入我們的變換矩陣供給著色器使用

unsigned int transformLoc = glGetUniformLocation(ourShader.ID, "
transform"); glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(trans)); //第一個是參數位置,第二個是矩陣數量,第三個是是否開啟矩陣置換,就是行和列換過來,這裏不需要。第四個是矩陣指針

這個時候,應該變換成功了。

技術分享圖片

  我們玩點花樣,讓圖案轉動起來,我們在傳入旋轉角度的時候加上時間變量

glm::mat4 trans;
trans = glm::translate(trans, glm::vec3(0.5f, -0.5f, 0.0f));
trans = glm::rotate(trans, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));

這樣,就能旋轉起來了,這裏是先旋轉,再進行位移,和我提醒的一致。

<五>初探opengl,變換我們的圖形