XNA Shader 逐頂點和逐畫素光照

2021-06-01 19:35:42 字數 2184 閱讀 9997

所謂逐頂點光照,簡單地說就是在vetext shader中計算光照顏色,該過程將為每個頂點計算一次光照顏色,然後在通過頂點在多邊形所覆蓋的區域對畫素顏色進行線形插值。現實中,光照值取決於光線角度,表面法線,和觀察點(對於鏡面高光來說)。具體實現時的shader**如下:

//相關全域性變數

shared float4x4 matworldviewproj;

shared float4x4 matworld;

shared float3 lightposition;

shared float4 ambientlightcolor;

shared float4 diffuselightcolor;

shared float4 specularlightcolor;

shared float3 cameraposition;

//vertexshader輸出結構

struct vertexshaderoutput

;//pixelshader輸入結構,只接受從vertexshader傳來的顏色

struct pixelshaderinput

;vertexshaderoutput vertexdiffuseandphong(float3 position : position,float3 normal : normal )

float4 ******pixelshader(pixelshaderinput input) : color

technique pervertexdiffuseandphong

}

由以上**可見,各畫素的顏色計算都是在vertexshader中實現的。程式截圖如下:

當考慮光照時,大部分人都認為逐頂點光照已經足夠好了。對於鑲嵌度較高的模型來說是這樣,但對某些多邊形較少的模型來說卻不一定。比如這個示例,球的多邊形較少,可以明顯看出稜角分明,高光效果也不理想。直接對頂點顏色進行插值所得的結果通常不夠精確,特別是對面積較大的多邊形來說。當處理高精度多邊形模型時,由於每個多邊形所覆蓋的區域很小,因此插值之後每個畫素的誤差也很小,所以逐頂點光照可以工作的很好。而當處理低模時,這種誤差就變的很大了。

逐畫素光照是對所有光照元素進行單獨插值,簡單地說就是在pixelshader中計算顏色。具體實現時的shader**如下:

//全域性變數

shared float4x4 matworldviewproj;

shared float4x4 matworld;

shared float3 cameraposition;

shared float3 lightposition;

shared float4 ambientlightcolor;

shared float4 diffuselightcolor;

shared float4 specularlightcolor;

struct vertexshaderoutputperpixeldiffuse

;struct pixelshaderinputperpixeldiffuse

;vertexshaderoutputperpixeldiffuse perpixeldiffusevs( float3 position : position, float3 normal : normal )

float4 diffuseandphongps(pixelshaderinputperpixeldiffuse input) : color

technique perpixeldiffuseandphong

}

由上面兩段**對比可知,演算法實際上是一樣的,只不過顏色的計算過程乙個放在vertexshader中,而另乙個放在pixelshader中。程式截圖如下,源**中可以通過按空格鍵切換兩種效果,逐畫素光照效果好:

使用逐畫素光照的另乙個好處是可以在渲染時新增並不存在的表面細節。通過bump map或normal map,可以在畫素級別讓原本平坦的表面表現出近似的凹凸效果。

當然,由於逐畫素的計算量要比逐頂點要大,所以請根據具體情況靈活選擇,如果你使用basiceffect,那麼預設是使用逐頂點光照,你必須新增basiceffect.preferperpixellighting=true才能開啟逐畫素光照。

最後以上大部分文字來自於clayman部落格中的the complete effect and hlsl guide的第十二章,在此感謝。

opengl光照之漫反射逐頂點渲染與逐畫素渲染

1,逐頂點渲染 模型中有多少個頂點就計算多少次,這種方式比較節約系統資源,但效果比較粗糙 2,逐畫素渲染 這種方式計算量特別大,有多少個畫素就計算多少次,但是效果會很好 逐頂點渲染漫反射光照效果 頂點shader attribute vec3 pos 頂點座標 attribute vec2 texc...

GLSL 逐頂點的光照

引言 在opengl中有三種型別的光 方向光 directional 點光 point 聚光 spotlight 本教程將從方向光講起,首先我們將使用glsl來模仿opengl中的光。我們將向shader中逐漸新增環境光 散射光和高光效果。後面的教程中我們將使用逐畫素光照以獲得更好的效果。接下來我們...

逐頂點高光反射

逐頂點高光反射 shader unity shader book chapter 6 specular vertex leve1 subshader cgprogram pragma vertex vert pragma fragment frag 引用內建的變數 include lighting....