1 將圖像逆時針旋轉90度,然后縮放0.5倍 2 glm::mat4 trans; 3 4 將90度裝換成弧度制,繞z軸旋轉,所以旋轉分量放在z分量處 5 trans = glm::rotate(trans, glm::radians(90.0f), glm::vec3(0.0, 0.0, 1.0)); 6 trans = glm::translate(trans, glm::vec3(-0.5f, -0.5f, 0.0f)); 7 8 trans = glm::scale(trans, glm::vec3(0.5, 0.5, 0.5)); //將變換過得的單位矩陣乘以向量vec3 9 10 unsigned int transformLoc = glGetUniformLocation(ourShader.ID, "transform");//獲取uniform的位置 11 12 將trans綁定到頂點着色器中的uniform,然后利用uniform實施變換 13 第一個參數是uniform的位置,第二個參數是所傳矩陣的個數, 14 第三個參數是詢問我們是否需要對矩陣進行置換(行與列交換),這里是不希望,所以是GL_FALSE 15 第四個參數將trans通過glm里的value_ptr函數轉化成我們需要的矩陣類型 16 glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(trans));
get uniform的地址時,必須先激活項目
1 glm::mat4 trans; 2 //如果先旋轉在平移,那么平移時會按照圖像旋轉后的新位置進行平移,所以最終結果有點出人意外 3 trans = glm::rotate(trans, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f)); //利用時間函數旋轉 4 trans = glm::translate(trans, glm::vec3(0.5f, 0.5f, 0.0f)); 5 6 //trans = glm::scale(trans, glm::vec3(2.0, 2.0, 2.0)); 7 8 //glUseProgram(shaderProgram); 9 glUseProgram(ourShader.ID); 10 11 unsigned int uniformLocation = glGetUniformLocation(ourShader.ID, "transform"); 12 glUniformMatrix4fv(uniformLocation, 1, GL_FALSE, glm::value_ptr(trans));
創建第二個圖像,移至左上角並按時間隨機縮放
1 glm::mat4 trans1; 2 trans1 = glm::translate(trans1, glm::vec3(-0.5f, 0.5f, 0.0f)); 3 GLfloat scaleMount = sin(glfwGetTime()); 4 trans1 = glm::scale(trans1, glm::vec3(scaleMount, scaleMount, scaleMount)); 5 6 //glUseProgram(ourShader.ID); 7 glUniformMatrix4fv(uniformLocation, 1, GL_FALSE, glm::value_ptr(trans1)); 8 glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);