轉換(Transformations),主要是指位移(Translate),縮放(Scaling),旋轉(Rotation)三種,opengl實現這三種轉換,主要是經過矩陣的運算來實現的。在這裏就會涉及到必定的矩陣、向量的運算了。html
opengl沒有提供現成的矩陣、向量運算的庫,這個須要咱們本身引入第三方的庫,在教程中做者是使用到了GLM庫,能夠在這裏下載。git
由於矩陣運算並不知足交換律,因此在這裏進行轉換的矩陣操做對於運算順序有要求,須要先縮放(Scaling),再旋轉(Rotation),最後再位移(Rotation)。而實際書寫過程可能又是這樣的順序:T * R * S,在代碼中調用順序是 T、R、S, 在這裏須要注意一下。咱們理解/讀矩陣組合運算的式子,應該是從右到左的順序。github
glm提供現成的位移、縮放、旋轉的矩陣運算方法,分別爲glm::translate、glm::scale、glm::rotation,假如咱們在這裏須要實現一個縮放、旋轉、位移的組合操做,咱們的代碼大概是這樣的:spa
// 轉換矩陣 glm::mat4 trans = glm::mat4(1.0f); // 位移 x軸移動0.5單位,y軸移動-0.5單位 trans = glm::translate(trans, glm::vec3(0.5f, -0.5f, 0.0f)); // 旋轉 繞y軸旋轉45度 trans = glm::rotation(trans, glm::radians(45.0f), glm::vec3(0.0f, 1.0f, 0.0f)); // 縮放 0.5 trans = glm::scale(trans, glm::vec3(0.5f, 0.5f, 0.5f));
這是一個組合運算的過程,最終獲得一個轉換後的矩陣。再將轉換好的矩陣傳給頂點着色器,就能看到最終的轉換效果了。頂點着色器接收轉換後的矩陣:.net
#version 330 core layout (location = 0) in vec3 aPos; layout (location = 1) in vec3 aColor; layout (location = 2) in vec2 aCoord; out vec3 oColor; out vec2 oCoord; uniform mat4 u_transform; void main() gl_Position = u_transform * vec4(aPos, 1.0f); oColor = aColor; oCoord = aCoord; }
GLSL內部也有對應的mat4類型的變量,用來存儲傳遞過來的轉換矩陣數據,再將這個乘以頂點座標,既能夠獲得轉換後的座標信息。code
賦值uniform部分對應的調整爲orm
glUniformMatrix4fv(location, 1, GL_FALSE, glm::value_ptr(trans));
參數1爲uniform變量的位置索引,參數4就是咱們要傳遞過來的矩陣數據,glm使用value_ptr方法將glm存儲的矩陣格式轉換爲GLSL使用的格式。htm
對應的代碼在這裏。blog