OpenGL學習筆記《五》轉換

  轉換(Transformations),主要是指位移(Translate),縮放(Scaling),旋轉(Rotation)三種,opengl實現這三種轉換,主要是經過矩陣的運算來實現的。在這裏就會涉及到必定的矩陣、向量的運算了。html

  opengl沒有提供現成的矩陣、向量運算的庫,這個須要咱們本身引入第三方的庫,在教程中做者是使用到了GLM庫,能夠在這裏下載。git

  由於矩陣運算並不知足交換律,因此在這裏進行轉換的矩陣操做對於運算順序有要求,須要先縮放(Scaling),再旋轉(Rotation),最後再位移(Rotation)。而實際書寫過程可能又是這樣的順序:T * R * S,在代碼中調用順序是 T、R、S, 在這裏須要注意一下。咱們理解/讀矩陣組合運算的式子,應該是從右到左的順序。github

  glm提供現成的位移、縮放、旋轉的矩陣運算方法,分別爲glm::translateglm::scaleglm::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

相關文章
相關標籤/搜索