unity简单shader实现物体描边效果

4 篇文章 0 订阅
1 篇文章 0 订阅

最近工作中突然有描边的小功能,就写了一个shader收藏,顺便分享下,不喜勿喷,欢迎建议,谢谢!

Shader "Unlit/TraceOutLine"
{
    Properties
    {
         //属性
        _MainTex("Texture", 2D) = "white" {}
        _Diffuse("Color",Color) = (1,1,1,1)
        _OutLineColor("OutlineColor",Color) = (1,1,1,1)
        _Outline("Outline",Range(0,1)) = 1
    }
        SubShader
        {
            //描边shader渲染方式
            Tags {"Queue" = "Geometry+1000" "RenderType" = "Opaque" }
            Pass
            {
                 Cull Front
                 CGPROGRAM
                 #pragma vertex vert 
                 #pragma fragment frag 
                 #include "UnityCG.cginc"
                 float4 _OutLineColor;
                 float _Outline;
                 struct v2f
                 {
                     float4 vertex:SV_POSITION;
                 };

                 v2f vert(appdata_base v)
                 {
                     v.vertex.xyz += normalize(v.normal) * _Outline / 10;

                     v2f o;
                     o.vertex = UnityObjectToClipPos(v.vertex);
                     return o;
                 };

                 fixed4  frag(v2f i) :SV_TARGET
                 {
                     return fixed4(_OutLineColor);
                 };

                 ENDCG
             }

             Pass
             {
                 Tags { "LightModel" = "ForwardBase" }
                //开启CG代码
                 CGPROGRAM
                //编写指令
                 #pragma vertex vert
                 #pragma fragment frag 
                 #include "UnityCG.cginc"
                 #include "Lighting.cginc"

                 sampler2D _MainTex;
                 float4 _MainTex_ST;
                 float4 _Diffuse;

                 struct v2f
                 {
                     float4 vertex:SV_POSITION;
                     float2 uv:TEXCOORD0;
                     float3 worldLightNormal:TEXCOORD1;
                     float3 worldNormal:TEXCOORD2;


                 };

                 v2f vert(appdata_base v)
                 {
                     v2f o;
                     o.vertex = UnityObjectToClipPos(v.vertex);
                     o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
                     float3 worldPos = mul(unity_ObjectToWorld,v.vertex);
                     o.worldLightNormal = UnityWorldSpaceLightDir(worldPos);
                     o.worldNormal = UnityObjectToWorldNormal(v.normal);
                     return o;
                 };

                 fixed4 frag(v2f i) :SV_TARGET
                 {
                     float3 worldNormalDir = normalize(i.worldNormal);
                     float3 WorldLightDir = normalize(i.worldLightNormal);

                     float3 texColor = tex2D(_MainTex,i.uv);

                     float ambient = UNITY_LIGHTMODEL_AMBIENT.rgb * texColor.rgb;

                     float3 diffuse = _LightColor0.rgb * _Diffuse.rgb * texColor.rgb * (dot(worldNormalDir,WorldLightDir) * 0.5 + 0.5);
                     float3 color = diffuse + ambient;

                     return fixed4(color,1);
                 };

                 ENDCG

             }

        }
            Fallback "Diffuse"
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Batman1208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值