利用矩陣進行平移,旋轉,縮放等圖像變換、創建第二個一模一樣的圖像並使之進行縮放等操作


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

 


免責聲明!

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



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