很普通的卡通材质

第一个成品shader,纪念一下。
看看效果
在这里插入图片描述
用了2个Pass,一个画外描边,一个画主颜色。模型是在原神官网下的。质量真不错。
下面是代码。初学 请多指教

Shader "Unlit/study02_Toon"
{
    Properties
    {
        _MainTex ("Main Tex", 2D) = "white" {}
        _MainColor ("Main Color", Color) = (1,1,1,1)

        _OutLine ("Out Line Color", Color) = (1,1,1,1)
        _OutLineOffset ("Out Line Offset",float) = 1

        _ShadowColor("ShadowColor",Color) = (0,0,0,0)
        _ShadowRange1("ShadowRange1",float) = 1
        _ShadowRange2("ShadowRange2",float) = 1
    }
    SubShader
    {
        Tags
        {
            "RenderPipeline"="UniversalRenderPipeline"
        }
        //OutLine 描边Pass
        Pass
        {
            Tags
            {
                "LightMode" = "SRPDefaultUnlit"
            }
            Cull Front
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            //模型->顶点
            struct a2v
            {
                float4 pos : POSITION;
                float4 nor : NORMAL;
            };

            //顶点->片元
            struct v2f
            {
                float4 pos: POSITION;
                float4 nor: NORMALE;
            };


            CBUFFER_START(UnityPerMaterial)
            half4 _OutLine;
            float _OutLineOffset;
            float _IsOpenOutLine;
            CBUFFER_END

            v2f vert(a2v In)
            {
                v2f Out;
                float3 data = In.pos + In.nor * (_OutLineOffset/100000);
                Out.pos = TransformObjectToHClip(data);
                Out.nor = -In.nor;
                return Out;
            }

            half4 frag(v2f In): SV_Target
            {
                half4 Out = _OutLine;
                return Out;
            }
            ENDHLSL
        }
        //Main 主颜色Pass
        Pass
        {

            Tags
            {
                "LightMode" = "UniversalForward"
            }

            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"

            //模型->顶点
            struct a2v
            {
                float4 pos : POSITION;
                float4 nor : NORMAL;
                float2 uv : TEXCOORD0;
            };

            //顶点->片元
            struct v2f
            {
                float4 pos: POSITION;
                float4 nor: NORMAL;
                float2 uv : TEXCOORD0;
            };

            TEXTURE2D(_MainTex);
            SAMPLER(sampler_MainTex);
            CBUFFER_START(UnityPerMaterial)
            float4 _MainTex_ST;
            float4 _MainColor;
            float4 _ShadowColor;
            float _ShadowRange1;
            float _ShadowRange2;
            CBUFFER_END

            v2f vert(a2v In)
            {
                v2f Out;
                Out.pos = TransformObjectToHClip(In.pos);
                Out.nor = In.nor;
                Out.uv = TRANSFORM_TEX(In.uv, _MainTex);
                return Out;
            }

            void GetLightDirAndColor(out float3 direction, out float3 color)
            {
                #if SHADERGRAPH_PREVIEW
	                direction = half3(0.5,0.5,0);
	                color=1;
                #else
                Light light = GetMainLight();
                direction = light.direction;
                color = light.color;
                #endif
            }

            half4 frag(v2f In): SV_Target
            {
                half4 col = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, In.uv);
                float3 lightDir;
                float3 lightColor;
                GetLightDirAndColor(lightDir, lightColor);
                float4 shadowDir = dot(In.nor, -lightDir);
                float4 shadowSmoOver = smoothstep(_ShadowRange1, _ShadowRange2, shadowDir);
                float4 shadowData = saturate(shadowSmoOver + _ShadowColor);
                half4 Out = col + _MainColor;

                return Out * shadowData;
            }

            ENDHLSL
        }


    }

}

欢迎提出修改意见!一起学习一起进步!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值