面片描边shader

如图
http://clynamen.github.io/blog/2014/06/24/outline-in-unity-with-mesh-transparency/

在这里插入图片描述

Shader "MyURP/Grid_EdgeHighLight"
{
    Properties
    {
        _BaseColor("Base Color", Color) = (1, 1, 1, 1)
        _BaseMap("Base Map", 2D) = "white" {}
        _Thickness("_Thickness", range(0, 10)) = 1
        _AlphaInner("_AlphaInner", range(0, 1)) = 0.1
    }

    SubShader
    {
        Tags
        {
            "RenderPipeline"="UniversalRenderPipeline"
            "RenderType"="Transparent"
            "IgnoreProjector"="True"
            "Queue"="Transparent"
        }


        Pass
        {
            Blend SrcAlpha OneMinusSrcAlpha/*, SrcAlpha One*/
            ZWrite On
            Tags
            {
                "LightMode" = "SRPDefaultUnlit"
            }
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            struct Attributes
            {
                float4 positionOS : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct Varyings
            {
                float4 positionHCS : SV_POSITION;
                float2 uv : TEXCOORD0;
            };

            TEXTURE2D(_BaseMap);
            SAMPLER(sampler_BaseMap);

            // 不加会导致不能合批  就会画三次
            CBUFFER_START(UnityPerMaterial)
            half4 _BaseColor;
            float4 _BaseMap_ST;
            float _Thickness;
            float _AlphaInner;
            CBUFFER_END


            Varyings vert(Attributes IN)
            {
                Varyings o;
                o.uv = IN.uv;
                o.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
                return o;
            }

            half4 frag(Varyings IN) : SV_Target
            {
                half4 col = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, IN.uv) * _BaseColor;
                col.a = _AlphaInner;
                return col;
            }
            ENDHLSL
        }

        Pass
        {
            Name "Outline"
            Tags
            {
                "LightMode" = "UniversalForward"
            }
            Cull Back
            ZWrite On
            ZTest Less
            Blend SrcAlpha OneMinusSrcAlpha
            ColorMask RGB
            Offset 15,15

            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            struct Attributes
            {
                float4 positionOS : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct Varyings
            {
                float4 positionHCS : SV_POSITION;
                float2 uv : TEXCOORD0;
            };

            TEXTURE2D(_BaseMap);
            SAMPLER(sampler_BaseMap);

            // 不加会导致不能合批  就会画三次
            CBUFFER_START(UnityPerMaterial)
            half4 _BaseColor;
            float4 _BaseMap_ST;
            float _Thickness;
            CBUFFER_END


            Varyings vert(Attributes IN)
            {
                Varyings o;
                o.uv = IN.uv;

                float3 dir = IN.positionOS.xyz - float3(0, 0, 0);
                dir = TransformObjectToWorldDir(dir);
                float3 worldPos = TransformObjectToWorld(IN.positionOS.xyz);
                worldPos += dir * 2 * _Thickness;

                o.positionHCS = TransformWorldToHClip(worldPos);
                return o;
            }

            half4 frag(Varyings IN) : SV_Target
            {
                half4 col = _BaseColor;
                return col;
            }
            ENDHLSL
        }
    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity的Shader可以通过以下步骤实现: 1. 创建一个新的Shader文件并将其命名为"Outlined/CustomOutline"。 2. 在Shader文件中,定义一个新的Pass,该Pass将渲染目标对象的轮廓。在Pass中,可以使用自定义的顶点和片段着色器来创建轮廓。 3. 在顶点着色器中,可以使用顶点法线来确定物体表面的方向,并将其传递到片段着色器中。然后,在片段着色器中,可以使用该法线来计算每个片段的边缘距离,然后使用此距离来创建轮廓。 4. 最后,在Pass中,将轮廓渲染到目标对象上,并在渲染完成后将其与原始渲染结果混合。 下面是一个基本的实现示例: ``` Shader "Outlined/CustomOutline" { Properties { _MainTex("Texture", 2D) = "white" {} _OutlineColor("Outline Color", Color) = (0,0,0,1) _OutlineWidth("Outline Width", Range(0.0, 0.1)) = 0.01 } SubShader { Tags { "RenderType"="Opaque" } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag // Define input structure struct appdata { float4 vertex : POSITION; float3 normal : NORMAL; }; // Define output structure struct v2f { float4 vertex : SV_POSITION; float3 normal : TEXCOORD0; }; // Vertex shader v2f vert(appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.normal = mul(unity_ObjectToWorld, float4(v.normal, 0)).xyz; return o; } // Fragment shader fixed4 frag(v2f i) : SV_Target { // Calculate edge distance using normal float edge = 1 - dot(i.normal, _WorldSpaceCameraPos.xyz - mul(unity_WorldToObject, i.vertex).xyz); // Create outline using edge distance fixed4 col = tex2D(_MainTex, i.uv); col.rgb = lerp(col.rgb, _OutlineColor.rgb, edge * _OutlineWidth); return col; } ENDCG } } FallBack "Diffuse" } ``` 这里的顶点着色器将物体表面的法线转换为世界空间,并将其存储在“normal”变量中。在片段着色器中,使用法线计算每个片段的边缘距离,并将其保存在“edge”变量中。最后,使用“lerp”函数将轮廓颜色与原始颜色进行混合,以便在渲染完成后将轮廓渲染到目标对象上。 希望这可以帮助你实现Shader

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值