標籤:class 旋轉 ima project 需要 png orm oat ogr
如果我們需要繪製兩個(或者多個)一樣的立方體(或者物體),只是位置、縮放、旋轉不一樣,那麼我們可以不需要多次將這個物體的頂點資訊、顏色資訊等發送到顯卡,而是發送一次,繪製多次,僅僅是每次繪製之前應用不同的轉換矩陣。這種方法叫做OpenGL Instancing。它的效率比每次都重新發送一次資料到顯卡要高很多。
看具體代碼:
1 void MyGlWindow::paintGL() 2 { 3 glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); 4 glViewport(0, 0, width(), height()); 5 6 //cube1 7 glm::mat4 projectionMatrix = glm::perspective(30.0f, ((float)width()) / height(), 0.1f, 10.0f); 8 glm::mat4 translationMatrix = glm::translate(projectionMatrix, glm::vec3(0.0f, 0.0f,-3.0f)); 9 glm::mat4 fullTransformMatrix = glm::rotate(translationMatrix, 54.0f, glm::vec3(1.0f, 0.0f, 0.0f));10 11 GLint fullTransformMatrixUniformLocation = glGetUniformLocation(programID, "fullTransformMatrix");12 glUniformMatrix4fv(fullTransformMatrixUniformLocation, 1, GL_FALSE, &fullTransformMatrix[0][0]);13 glDrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_SHORT, 0);14 15 //cube216 translationMatrix = glm::translate(projectionMatrix, glm::vec3(2.0f, 0.0f, -4.0f));17 fullTransformMatrix = glm::rotate(translationMatrix, 126.0f, glm::vec3(0.0f, 1.0f, 0.0f));18 glUniformMatrix4fv(fullTransformMatrixUniformLocation, 1, GL_FALSE, &fullTransformMatrix[0][0]);19 glDrawElements(GL_TRIANGLES, numIndices, GL_UNSIGNED_SHORT, 0);20 21 }
我們僅在paintGL()函數中增加了幾行代碼(16-19行),就可以繪製另外一個立方體。
我們在16-17行重新改變了translationMatrix和fullTransformMatrix轉換矩陣(我們甚至都沒有定義新的矩陣,而僅僅是改變其數值),重新改變了位置、旋轉。projection 矩陣我們並不想改變,還是之前的設定。
第18行和12行完全一樣,但是這是必須的,因為要重新應用這個uniform變數才能起作用。
第19行使用了新的變換矩陣對立方體進行了第二次繪製。編譯運行我們得到以下效果:
3D Computer Grapihcs Using OpenGL - 14 OpenGL Instancing