1. 程式人生 >實用技巧 >其它 >opengl學習筆記(三)

opengl學習筆記(三)


技術標籤:openglshader

一致變數

一致變數就是在shader中執行時不變的量,像是全域性常量。往往是一些變化矩陣,比如頂點處理器中存在著座標變換,並且對於每一個頂點的處理都相同,那麼就用uniform定義。

gScaleLocation = glGetUniformLocation(ShaderProgram, "gScale");

通過這個函式,我們可以獲得我們程式中的一致變數。第一個引數是我們連線到管線的程式,第二個引數是某一個一致變數的控制代碼。我的理解是在opengl中已經定義好了gScale,所以當我們索引gScale的時候,就可以獲得關於這個一致變數的地址。

glUniform1f(gScaleLocation, sinf(Scale));

當我們想要修改的時候,也同樣用gScaleLocation,這是一個變數,我表達的意思是通過glGetUniformLocation獲得的是地址變數,我們修改的時候通過它來修改就可以。

glUniform的其它用法可以參考:
(https://blog.csdn.net/me_badman/article/details/62418012)

插值

為什麼需要插值,我們從頂點著色器輸出的是每個點的一些資訊,位置,顏色,紋理座標,法線等等。在幾何處理器我們要將圖元轉換成片元,就比如轉換成三角形。那麼三角形內部會有很多畫素,這些畫素並沒有頂點著色器中傳來的屬性那麼豐富,僅僅是有位置資訊。

這時我們需要通過插值的方法,為這些畫素新增屬性。舉一個插值的方法,首先根據三角形頂點的值,確定邊上的值,比如法線,那就是a*(端點1的法線) + b*(端點2的法線)。a和b是邊上的點到端點距離的比例,和為1。至於+代表的是合併的意思,座標的加法,或者向量的加法等等。然後三角形內部的點通過同樣的方法,根據邊上的點確定。可以使用掃描線確定是邊上的哪兩個點。

如果說後面的著色器沒有顯示地請求頂點的某個屬性,那麼在優化的過程中會捨棄掉對於該屬性的操作。

索引繪製

為什麼要用索引繪製?因為索引繪製可以很大的節省我們的記憶體。比如一個四面體,四個三角形,當我們用順序儲存的時候是需要儲存12個點,每個點都擁有一些屬性資訊,十分消耗記憶體。繪製的時候按照順序3個3個讀出。

索引繪製是儲存頂點的同時,儲存索引。我們儲存四個點,並存儲12個繪製這四個點的順序即可。

實現方法:
建立索引緩衝區和之前提過的建立頂點緩衝是一樣的。需要將array相關替換為element。

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
glDrawElements(GL_TRIANGLES, 12, GL_UNSIGNED_INT, 0);

12是索引個數,0是相對於索引緩衝區第一個位置的偏移。

一直沒找到為什麼索引緩衝可以知道它對應的是哪個頂點緩衝?希望瞭解的人可以指點一下!!

複合變換

複合變換的意義很好理解,為了簡化計算量,將多個座標系之間的轉換,儲存到一個矩陣,一個變數之中。包括旋轉,平移和縮放操作。

順序一般是先縮放,再旋轉,再平移。