显示着色器阴影

问题描述 投票:1回答:1

我目前正试图将我的资产风格从现实转变为低聚/低音。 例如,我有一个香椿表面着色器

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这样的东西:我可以做基于材质的着色器,还是后期处理效果? 谢谢

unity3d shader shadow
1个回答
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,因此您不必为每种材质指定它。

© www.soinside.com 2019 - 2024. All rights reserved.