Unity3d 卡通着色器阴影

Unity3d 卡通着色器阴影,unity3d,shader,shadow,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; ha


我目前正在尝试将我的资产风格从逼真改为低保真/卡通。
例如,我有一个卡通曲面着色器

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纹理渐变。这适用于对象上的照明效果。
由于我的场景中有多个使用此着色器的对象,其中一些对象正在将阴影投射到我的场景中。 正如你所看到的,这里的阴影不是一个斜坡,而是一个连续的梯度,因为它(可能)是在unity的某种环境中完成的。我现在的问题是:是否有一个选项可以在全局阴影上创建这种颜色渐变效果?比如: 我可以基于材质着色器进行处理,还是可以进行后期处理?

感谢使用曲面着色器:不,您不能在着色器中执行此操作。实际上,我认为获得统一卡通效果的最佳方法是使用颜色分级LUT作为后期效果。LUT的好处在于,您可以在photoshop中轻松创建一个LUT,方法是首先对常规图像应用一些很酷的效果,直到它看起来像您想要的样子(例如“Posterize”),然后复制效果堆栈以应用于LUT纹理,如。当您在Unity中使用此LUT时,一切都将与应用Photoshop过滤器时一样。我注意到的一个小警告是,一些标准的LUT纹理需要垂直翻转才能使用后期处理堆栈。这是一个关于如何创建后置LUT的很好的教程

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

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

为此,可以将阴影渐变设置为“从”脚本,这样就不必为每个材质指定阴影渐变

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

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

half shadow = SHADOW_ATTENUATION(IN)
shadow = tex2D(_ShadowRamp, float2(shadow, 0));
为此,可以将阴影渐变设置为“从”脚本,这样就不必为每个材质指定阴影渐变