【问题标题】:Toon shader shadow卡通着色器阴影
【发布时间】:2019-03-15 12:20:39
【问题描述】:


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

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 上。 正如你所看到的,这里的阴影不是一个斜坡,而是一个连续的渐变,因为它(可能)是在某种统一的环境中完成的。我现在的问题是:是否也可以选择在全局阴影上创建这种颜色渐变效果?类似this: 我可以基于材质着色器进行处理,还是后期处理效果?
谢谢

【问题讨论】:

    标签: unity3d shader shadow


    【解决方案1】:

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

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

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

    为此,您可以将阴影渐变设置为来自脚本的global shader variable,这样您就不必为每种材质分配它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-23
      • 2014-04-23
      • 2016-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多