unity-shader描边

shader描边效果的原理:两个pass,第一个pass渲染背面(将顶点沿着 法线方向外拓),第二个pass渲染正面
Cull 指令:(详细命令介绍参考:https://blog.youkuaiyun.com/a133900029/article/details/80593513)
原图:
在这里插入图片描述
描边后:
在这里插入图片描述
顶点外拓可以是 模型空间,世界空间,视角空间,这里在模型空间中进行法线外拓

Shader "Unlit/OutLine"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _OutLineSize("OutLineSize",Range(0,1))=0.5
        _OutLineColor("OutLineColor",Color)=(1,1,1,1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100
        
        Pass
        {
            Cull Front
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                float4 normal:NORMAL;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            float4 _OutLineColor;
            float _OutLineSize;

            v2f vert (appdata v)
            {
                v2f o;
                v.vertex += v.normal * _OutLineSize;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }

            fixed4 frag (v2f i) : Color
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                return _OutLineColor;
            }
            ENDCG
        }
        Pass{            
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                float3 normal:NORMAL;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;


            v2f vert (appdata v)
            {
                v2f o;                
                //物体空间法线外拓
				v.vertex.xyz += v.normal * _Outline;
				o.vertex = UnityObjectToClipPos(v.vertex);

				//视角空间法线外拓
				//float4 pos = mul(UNITY_MATRIX_V, mul(unity_ObjectToWorld, v.vertex));
				//float3 normal = normalize(mul((float3x3)UNITY_MATRIX_IT_MV,v.normal));
				//pos = pos + float4(normal,0) * _Outline;
				//o.vertex =  mul(UNITY_MATRIX_P, pos);

				//裁剪空间法线外拓
				//o.vertex = UnityObjectToClipPos(v.vertex);
				//float3 normal = normalize(mul((float3x3)UNITY_MATRIX_IT_MV,v.normal));
				//float2 viewNoraml = TransformViewToProjection(normal.xy);
				//o.vertex.xy += viewNoraml * _Outline;
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {                
                fixed4 col = tex2D(_MainTex, i.uv);
                return col;
            }
            ENDCG


        }
    }
}

Cull指令:默认是剔除背面。
cull front: 剔除前面
cull off:前后都渲染
cull back:剔除背面

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值