OpenGL教程翻譯 第九課 插值

2021-07-04 02:55:48 字數 2022 閱讀 3491

本章講述三維渲染管線中的乙個非常重要的部分——插值,它是光柵器對從頂點著色器輸出的變數所做的操作。正如你已經看到的,為了在螢幕上得到一些有意義的東西,你需要指定vs輸出變數中的乙個為「gl_position」。這是乙個四維向量,含有頂點的其次座標。這個變數中的xyz分量被除以其w分量(這是乙個透視分割的過程,後面的教程會另對其進行詳細說明)並且任何超出規範邊框(xy介於【-1,1】間;z介於【0,1】之間)的成分都將被減掉。其結果會被轉換到螢幕空間座標,然後光柵器將此三角形(或任何受支援的圖元型別)渲染到螢幕上。

光柵器在三角形的三個頂點之間執行插值(沿著線或者其他技術),並且通過執行片元著色器來「訪問」三角形內的每乙個畫素點。片元著色器會返回此片元的顏色值,光柵器將將這個顏色值放置於顏色緩衝區內並最終顯示出來(在通過一些其他測試例如深度測試之後),而來自頂點著色器的其他任何變數都不經歷上述步驟。如果片元著色器沒有明確的表示要使用那個變數(你可以用相同的頂點著色器混合並匹配多個片元著色器),那麼乙個共同的驅動優化將丟棄vs中的任何只影響該變數的指令(為那個特定的結合此vs和fs為一對的著色器程式)。然而如果fs確實用到這個變數,那麼光柵器在光柵化過程對其進行插值。這通常意味著緊挨著的兩個畫素點的值彼此之間會有一點差異(儘管三角形離相機越來越元這種現象變得更不大可能)。

常見的兩個依賴於這種插值的變數是三角形法線和紋理座標。頂點法線的值通常通過計算包含此頂點的所有三角形的法線的平均值來得到。如果該物件不是平面的,這通常意味著這三個三角形的的共同頂點的頂點法線將彼此不同。在這種情況下我們依靠插值來計算每乙個畫素的特定法線。這個特定法線用於光照計算中使用,為的是使得光照效果更加逼真。紋理座標插值與此類似。這些座標是模型的一部分,被指定於每個頂點。為了用紋理「覆蓋」三角形,你需要對每乙個畫素點做同樣的處理,並為其指定正確的紋理座標。這些座標是插值的結果。

本章中我們將會看到對三角形表面的不同顏色進行差值得到的效果。因為鄙人較懶,我們就在vs中得到顏色吧。還有乙個更加乏味的方法:讓頂點緩衝器提供顏色。通常你不從頂點緩衝器獲取顏色。你提供紋理座標並從中取樣。而顏色則會在之後的光照計算中進行處理

out vec4 color;

引數在渲染管線之間傳遞時必須用「out」關鍵字進行宣告,並且必須是著色器中的全域性變數。顏色是乙個4-vector,因為xyz分量(分別)攜帶rgb值,而w是alpha值(畫素的透明度)。

color = vec4(clamp(position, 0.0, 1.0), 1.0);

在渲染管線中的顏色通常用乙個在【0.0,1.0】範圍內的浮點值。對於每乙個顏色通道(共計有16m顏色),這個值之後都被對映到從0到255之間的整數作為乙個顏色的顏色通道。我們通過乙個關於頂點位置的函式來為片元設定顏色。首先我們用內建的clamp()函式來確保這些值不會跑出0.0-1.0的範圍。原因是三角形左下方的頂點位於-1,-1.如果我們不進行clamp()轉換,那麼這個值就會被光柵化程式插值,並且在x和y取值達到0之前我們將什麼都看不見,因為每乙個小於或等於0的值都會被渲染為黑色。這意味著每個方向的邊的一半,在顏色通過0點而變得有意義之前,將會是黑色。通過clamping,我們使僅三角形左下角的頂點為黑色,而離它越遠的地方顏色很快變得越來越亮。試著玩一玩clamp函式——將他全部刪除或者改變其引數檢視效果。

clamp函式的結果不直接作為輸出變數,因為輸出變數是乙個四維向量而位置是乙個三維向量(clamp不會改變分量的個數,只改變他們的值)。從glsl的觀點看這裡沒有預設的轉換,對此我們必須清楚明白。因而我們使用「vec4(vec3,w)」,它通過將三維向量和使用者提供的w值來建立乙個四維向量。本例中我們使用1.0,因為它作為顏色的alpha部分,而且我們想要畫素點是完全不透明的。

in vec4 color;

vs的輸出顏色是fs的輸入顏色。這個變數通過光柵化程式進行插值,所以每乙個fs(可能)會獲得不同的顏色。

fragcolor = color;

我們用經過插值的顏色直接作為片元著色器的顏色而沒有進一步的改變,本章到此結束。

OpenGL3 0教程 第九課 VBO索引

分類 opengl es opengl3.0教程 目前為止,建立vbo時我們總是重複儲存一些共享的頂點和邊。本課將介紹索引技術。借助索引,我們可以重複使用乙個頂點。這是用索引緩衝區 index buffer 來實現的。索引緩衝區儲存的是整數 每個三角形有三個整數索引,用索引就可以在各種屬性緩衝區 頂...

VBScript教程 第九課VBScript過程

vb教程 vbscript過程 過程分類 在 vbscript 中,過程被分為兩類 sub 過程和 function 過程。sub 過程 sub 過程是包含在 sub 和 end sub 語句之間的一組 vbscript 語句,執行操作但不返回值。sub 過程可以使用引數 由呼叫過程傳遞的常數 變數...

第九課 變數

任務與 修改 沒有定義變數r,在第四行float r1,r2之後加上r就可以 include include intmain 閱讀程式 閱讀下面的程式,在閱讀過程中,請為每乙個變數畫出乙個方框,代表對應的記憶體空間。隨著閱讀,標明變數的變化過程,達到讀懂程式的目的。include intmain 圖...