卡通着色器阴影

时间:2019-03-15 12:20:39

标签: unity3d shader shadow


我目前正在尝试将资产样式从现实变为低多边形/卡通。
例如,我有一个卡通表面着色器

half4 LightingRamp(SurfaceOutput s, half3 lightDir, half atten) {
    half NdotL = dot(s.Normal, lightDir);
    half diff = NdotL * 0.5 + 0.5;
    half3 ramp = tex2D(_LightingTex, float2(diff, 0)).rgb;
    half4 c;
    c.rgb = _LightColor0.rgb * atten * ramp *_Color;    
    c.a = s.Alpha;
    return c;
}

其中_LightingTex是2D纹理渐变。这对于在对象themselfs上的照明效果很好。
当我的场景中有多个带有此着色器的对象时,其中一些对象将阴影投射到我的wall上。 如您所见,这里的阴影不是渐变,而是连续的渐变,因为它(可能)是在某种环境下从整体上完成的。我的问题现在是:是否可以在全局阴影上创建此Colorramp效果?类似于this: 我可以基于材质着色器吗,还是后处理效果?
谢谢

1 个答案:

答案 0 :(得分:0)

使用表面着色器:不,您不能在着色器中执行此操作。实际上,我认为获得统一卡通效果的最佳方法是使用颜色分级LUT作为后期效果。 LUT的伟大之处在于,您可以在photoshop中轻松创建一个,方法是先对常规图像应用一些很酷的效果,直到看起来像您想要的方式为止(例如“ Posterize”),然后复制效果堆栈以应用于LUT纹理,例如this one。当您在Unity中使用此LUT时,所有外观将与应用Photoshop滤镜时的外观相同。我注意到的一个小警告是,一些标准的LUT纹理需要垂直翻转才能与后处理堆栈一起使用。 Here是有关如何创建后置LUT的不错的教程。

如果您想直接在着色器中获得类似卡通的阴影,那么做一个普通的正向渲染的顶点/片段着色器并不困难,尽管这本身就需要一些关于它们如何工作的知识-我可以建议查看标准着色器源代码,thisthis(有些过时)教程。您可以在我的帖子here中找到有关如何添加阴影支持的详细信息。您唯一需要更改的就是向阴影蒙版添加类似的颜色渐变:

half shadow = SHADOW_ATTENUATION(IN)
shadow = tex2D(_ShadowRamp, float2(shadow, 0));

为此,您可以从脚本中将阴影渐变设置为global shader variable,因此不必为每种材质分配阴影渐变。