按ShadeX 3中《Dot3 Cel Shading》的方法所渲染的卡通茶壺,簡單的代碼效果居然如此好。因為是卡通渲染,所以除了最後著色以外的大部分計算都可以移動到vertex shader中,不過因為My Code是在普通渲染的基礎上改的,所以vertex shader中只是做了基本的變換。另外如果加上高光,效果反而不真實了,直接用普通光照模型計算出的漫反射進行調整就能得出不錯的效果。
普通渲染(漫反射+高光)+ 邊緣輪廓線:
卡通著色:
多條過渡帶:
完整的pixel shader代碼:
void PixelShader(out half4 color : COLOR0,
in float3 worldPos :TEXCOORD0,
in float3 normal : TEXCOORD1)
{
normal = normalize(normal);
float3 lightVect = normalize( lightPos - worldPos);
float diffuse = saturate( dot ( normal,lightVect));
float3 eyeVect = normalize( eyePos - worldPos);
half scale = saturate(dot( normal, eyeVect));
int scaleFactor = floor(scale * shaders);
scale = scaleFactor / shaders;
if(scale < exclude / shaders)
{
color.xyz = 0;
}
else
{
diffuseColor = lightColor * diffuseColor * diffuse;
color.xyz = diffuseColor * scale + diffuse / shaders;
}
color.w = 1.0;
}
shaders是顏色帶的數量,exclude是邊緣輪廓線寬度,上面中間的三幅圖中shaders=4,exclude=1。