opengl教程翻譯 9插值

2022-09-09 02:27:10 字數 1858 閱讀 6316

背景知識

這個教程演示了乙個3d管線中非常重要的部分-插值,光柵器對從頂點著色器出來的變數所執行的操作。你已經看到了,為了在螢幕上獲得一些有意義的東西,你需要指定其中乙個從頂點著色器出來的變數為'gl_position'。這是乙個包含了頂點對應座標的4-向量。向量中的xyz分量被w分量分割(乙個被稱為透明切割的過程,在教程中有專門講解它的課程),接著在標準化格仔([-1, 1])之外的任何分量將會被裁剪。結果被轉換到螢幕空間座標,然後三角形(或其他可支援的圖元型別)就被光柵器渲染到螢幕上了。

光柵器在三個三角形頂點間執行插值操作(一行接一行或其他方式),然後通過執行片段著色器「訪問」三角形內部的每個畫素。我們期望片段著色器能返回乙個能顯示的畫素顏色(在通過一些額外的測試後,比如深度測試等),這些畫素顏色被光柵器放在顏色緩衝中。其他從頂點著色器從出來的變數(譯者注:指那些沒有被放在顏色緩衝中,但又必須被渲染出來的變數)都不會通過上面的步驟。如果片段著色器不明確請求這些變數(你可以結合幾個片段著色器匹配乙個頂點著色器),那麼乙個通用的驅動優化器將會丟棄在頂點著色器中只是影響這個變數的說明(特殊的著色器程式是頂點著色器和片段著色器的配對組合)。然而,如果片段著色器使用了在光柵化中光柵器插值了的變數,以及每一次片段著色器呼叫的都是匹配到特定位置的插值了的值。這通常意味著那些緊密相連的畫素的值會有些不同(儘管隨著三角形越來越遠離攝像機這變得無關緊要)。

兩個經常依賴插值的很通用的變數是三角形法向量和紋理座標。頂點法向量經常是被作為包含這個頂點的所有三角形的三角形法向量的平均值計算的。如果物體不完全平坦,這意味著每個三角形的三個頂點法向量是不用於其他三角形的。在這種情況下,我們依靠插值來計算每個特定畫素的法向量。這個法向量用於為了呈現更真實的光照效果表現的光照計算。對紋理座標也是類似的。這些座標作為模型的一部分被定義在每乙個頂點上。為了用紋理「覆蓋」三角形,你需要為每個畫素執行抽樣操作,然後為那個畫素指定正確的紋理座標。這些座標是插值的結果。

在這個教程中我們會看到通過在三角形表面插不同顏色的值從而看到插值的效果。因為我很懶我們在頂點著色器中生成顏色。一種更乏味的方法是從頂點緩衝中提供它。通常我們不從頂點緩衝中提供顏色。你提供紋理座標和從乙個紋理中抽樣顏色。這個顏色稍後會被光照計算處理。

原始碼演練

out vec4 color;

引數通過兩個管線時必須用'out'保留字以及在著色器全域性範圍內定義。這個顏色是乙個4-向量,因為xyz分別分量攜帶rgb值而w為alpha值(畫素透明度)。

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

顏色在圖形管線中常常表示為乙個範圍[0.0, 1.0]間的浮點型點。這個值之後在每一條channel被對映成0~255的整型(共)。我們把頂點顏色值設為乙個頂點頂點函式。首先我們使用內建函式clamp()確保我們才能1,-1。如果我們拿這個值作為顏色值,它會被光柵器插值,不過知道x和y雙雙超過0否則我們看不到任何東西,因為小於等於0的值會被渲染成黑色。這意味著在顏色超過0變得有意義之前,每個方向半數的邊是黑的。通過鎖定範圍我們僅僅讓左下遠端為黑色,不過隨著我們越來越離開那顏色很快變得明亮許多。嘗試把玩clamp函式--完全刪除它或改變它的引數,看看效果。

clamp函式的結果對於輸出變數來說不完全正確,因為變數是乙個4-向量而位置是乙個3-向量(clamp並不改變分量的個數,而只是它們的值)。glsl檢視點中也沒有預設轉換,所以我們必須使它明確。我們用通過用給出的w值串聯乙個3-向量,來建立乙個4-向量的表示法'vec4(vec, w)'。在我們這個例子中,我們使用1.0因為它會去到顏色的alpha部分,我們想要畫素完全不透明。

in vec4 color;

跟在頂點著色器中輸出顏色想法,這是在片段著色器中輸入顏色。這個變數通過光柵器插值所以每個片段著色器(很可能)執行了不同的顏色。

fragcolor = color;

我們使用插值後的顏色作為不更多修改的片段顏色,以此完成本課程。

opengl 教程 9 頂點屬性插值

本章我們了解3d管線的乙個重要特性,在光柵化階段的頂點屬性插值。從前面的教程我們知道,為了在螢幕上輸出渲染的物體,我們在頂點shader中輸出gl position,這是乙個四維向量,表示齊次空間的頂點座標,x,y,z都經過了透視除法,除以了w值,x y的範圍是 1,1 而z的範圍是 0,1 而w則...

opengl 教程 9 頂點屬性插值

本章我們了解3d管線的乙個重要特性,在光柵化階段的頂點屬性插值。從前面的教程我們知道,為了在螢幕上輸出渲染的物體,我們在頂點shader中輸出gl position,這是乙個四維向量,表示齊次空間的頂點座標,x,y,z都經過了透視除法,除以了w值,x y的範圍是 1,1 而z的範圍是 0,1 而w則...

OpenGL教程翻譯 第九課 插值

本章講述三維渲染管線中的乙個非常重要的部分 插值,它是光柵器對從頂點著色器輸出的變數所做的操作。正如你已經看到的,為了在螢幕上得到一些有意義的東西,你需要指定vs輸出變數中的乙個為 gl position 這是乙個四維向量,含有頂點的其次座標。這個變數中的xyz分量被除以其w分量 這是乙個透視分割的...