本章我們了解3d管線的乙個重要特性,在光柵化階段的頂點屬性插值。從前面的教程我們知道,為了在螢幕上輸出渲染的物體,我們在頂點shader中輸出gl_position,這是乙個四維向量,表示齊次空間的頂點座標,x,y,z都經過了透視除法,除以了w值,x、y的範圍是[-1,1],而z的範圍是[0,1],而w則成為了1.0(因為w/w的緣故),接著會進行視口變化,轉化到螢幕空間,然後進行光柵化操作。
光柵化階段會執行頂點屬性插值操作,而三角形內部光柵化後的片元(或者畫素)會執行片元shader,片元shader會返回該片元的顏色,然後會進行深度測試、模版測試等操作,如果通過這些測試,那麼該片元的顏色將會更新framebuffer中對應畫素的顏色。
頂點shader中的變數如果沒有經過上述步驟,可能會被driver優化掉,從而提高程式效能,比如乙個頂點屬性在頂點shader中存在,但沒有被傳輸到片元shader,就有可能被優化掉,而傳到片元shader的頂點屬性則會執行插值操作。主要根據三個頂點的屬性,比如顏色,執行雙線性插值,得到片元(或畫素)的顏色, 插值後的三角形通常都是漸變顏色的。
可以參考一下我的另外一篇文章,專門接受頂點屬性插值的:
兩個常依賴於插值的頂點屬性是頂點法向和紋理座標。對乙個三角形來說,常用三個頂點法向平均值做為三角形面的法向值,但當三角形面不是平(flat,意思是說三角形面上的顏色是一樣的,沒有漸變之類的效果)的時候,我們一般通過插值方法得到三角形上每個畫素的法向值。得到插值後的法向值經常在片元shader中用來計算光照顏色,而紋理座標插值主要是用來取樣紋理,得到該紋理上相應的顏色值,然後和光照計算得到的顏色混合,得到畫素最終的顏色。
在這片教程中,我們將會看到顏色插值的效果。
主要**:out vec4 color;
在管線之間傳輸的變數,都要被宣告為out,out是乙個shader保留關鍵字。顏色變數用了vec4,xyz的值分別表示rgb,w的值為顏色的alpha值。
color = vec4(clamp(position, 0.0, 1.0), 1.0);
圖形管線中的顏色值,通常用範圍在[0.0,1.0]之間的浮點數表示,這個值能夠被對映到[0,255]。我們根據頂點位置設定頂點的顏色,並用內建函式clamp把顏色值限定在[0.0,1.0]之間,因為頂點座標xy值在[-1.0,1.0]之間變化,如果不做clamp操作,顏色可能出現負值,這時就成了為黑色,並不是我們所要的效果。
在glsl中,clamp函式並沒有vec4的版本,所以我們擴充套件成四維座標,並設定w=1.0,表示alpha=1.0,即顏色混合操作時,該顏色是透明的。
in vec4 color;
在片元shader中,定義輸入顏色,該輸入顏色是頂點屬性插值後畫素的顏色。我們用該插值顏色,做為片元shader最終的輸出顏色。
fragcolor = color;
程式執行後效果如下,注意左邊的圖是使用沒有clamp函式的顏色,此時部分區域是黑色:
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
在3d渲染中,輸入資料是一些primitive資訊,包括頂點位置 顏色 紋理座標等等。在光柵化階段,primitive 一般為三角形 被轉化成一系列的fragment 或者稱為畫素 這些fragment接下來要做ps操作,此時每個fragment都有位置 顏色 紋理座標這些屬性資訊,這些屬性資訊通過...