OpenGL程式設計逐步深入(九)插值處理

2021-07-02 01:26:00 字數 1690 閱讀 9672

注:文中vs代指頂點著色器,fs代指片段著色器。

這個教程和大家展示3d管道中非常重要的部分,即interpolation(插值)。光柵化程式執行的插值變數由vs產生。正如你已經見到過的,為了在螢幕中顯示一些有意義的東西,你需要在vertex shader中指定乙個輸出變數』gl_position』。它是乙個包含頂點座標的有4個分量的向量。x/y/z分量會和w分量做除法運算,任何分量超出規範化正方形([-1,1])的部分將會被裁剪。這些值會被轉換成螢幕空間座標系,接著三角形(或者其他指定圖形)會被光柵化程式渲染到螢幕上。

光柵化程式在三角形的三個頂點之間進行插值處理,會訪問三個頂點之間每乙個畫素,然後對每個畫素點執行fragment shader(片段著色器)。片段著色器將返回乙個畫素顏色,光柵化程式將該顏色存放到顏色緩衝區中。vertex shader(頂點著色器)輸出的其他變數則不經過這些步驟。如果fragment shader沒有顯式的請求這些變數,驅動程式會進行優化處理,去除vs中這些變數相關的指令。然而,如果fs沒有用到光柵化程式光柵化處理時進行插值的變數,每個fs的呼叫會提供乙個插值和指定的location進行匹配。這意味著這些相鄰畫素的值會略有不同。

兩種常見的依賴這種插值的變數是三角形法線和紋理座標。頂點法線通常通過包含該頂點的所有三角形法線的平均值來計算。如果乙個物件不是完全平坦的就意味著每個三角形的三個頂點法線會有所不同。在這種情況下我們依靠插值法計算每個畫素的法線。這些法線用於燈光計算上以獲得更加逼真的燈光效果。紋理座標的情況也相似,這些座標是模型的一部分,由每個頂點提供。為了將紋理覆蓋在三角形上,你需要為每個畫素執行相同的操作並且為每個畫素指定正確的紋理座標。這些座標也是通過插值法獲得。

在這個教程中我們會看到通過插值法對三角形表面畫素插入不同顏色值後的效果。通常我們不在頂點緩衝區中提供顏色,而是提供紋理座標,顏色從紋理中獲取。這些顏色稍後會被光照計算程式處理。

清單1.頂點著色器shader.vs**

#version 330

layout (location = 0) in

vec3 position;

uniform

mat4 gworld;

outvec4 color;

void main()

主程式**和上節相比未做改動。

out

vec4 color;

管道的不同階段傳遞引數需要使用保留字out並且要定義在shader的全域性作用域中,該顏色是個四分量向量,xyz分量代表rgb,w分量代表透明度。

color = vec4(clamp(position, 0.0, 1.0), 1.0);
顏色在圖形管道中,通常用在[0.0,1.0]之間的浮點數表示。這個值稍後會被對映成[0,255]的整數。我們設定顏色值隨著位置的改變而改變。首先我們使用內建的函式clamp()保證該值不會超過[0.0,1.0]這個範圍。由於三角形左下角的頂點x、y座標為-1,-1,經過clamp()函式呼叫會轉換為0,所以左下角為黑色。

clamp函式處理的結果是乙個三分量向量,我們通過vec4(vec3, w)這種形式將它增加乙個w分量,該值為1表明透明度為完全不透明。

你將會看到三角形不同部分呈現不同的顏色。

openGL 頂點屬性插值

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

透視校正插值 OpenGL

在3d渲染中,輸入資料是一些primitive資訊,包括頂點位置 顏色 紋理座標等等。在光柵化階段,primitive 一般為三角形 被轉化成一系列的fragment 或者稱為畫素 這些fragment接下來要做ps操作,此時每個fragment都有位置 顏色 紋理座標這些屬性資訊,這些屬性資訊通過...

OpenGL教程翻譯 第九課 插值

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