按ShadeX 3中《Dot3 Cel Shading》的方法所渲染的卡通茶壶,简单的代码效果居然如此好。因为是卡通渲染,所以除了最后着色以外的大部分计算都可以移动到vertex shader中,不过因为我的代码是在普通渲染的基础上改的,所以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。