URP Simple mesh雾效

1 . 用菲尼尔控制外边缘模糊加上菲尼尔反向后的内边缘模糊,用参数两者的强度控制;

2 . 用uv或者mesh的顶点的轴向消除掉两端的硬度(这里用UV);

思路简单,代码如下:

Shader "Unlit/MeshLight"
{
    Properties
    {
        _BaseColor("Base Color",color) = (1,1,1,1)
        _BaseMap("BaseMap", 2D) = "white" {}
        _MaskFre("光线范围",Range(0,10)) = 1
        _sofLight("边缘柔软",Range(0,10)) = 0.5
        _PowLight("光照强弱",Range(1,30)) = 1
        _uvSpeed("动画速度",vector ) = (0,0,0,0)
    }
 
    SubShader
    {
        Tags { "RenderPipeline"="UniversalPipeline" "RenderType" = "Transparent"  "Queue" = "Transparent" "PreviewType"="Skybox" }
        LOD 100
        Cull off
        ZWrite Off
        // Blend SrcAlpha OneMinusSrcAlpha
        Blend One One
 
        Pass
        {
            Name "Unlit"
            HLSLPROGRAM
            // Required to compile gles 2.0 with standard srp library
            #pragma prefer_hlslcc gles
            #pragma exclude_renderers d3d11_9x
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fog
            #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
            #include "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl"
 
 
            struct Attributes
            {
                float4 positionOS       : POSITION;
                float2 uv               : TEXCOORD0;
                float4 normalOS         : NORMAL;
            };
 
            struct Varyings
            {
                float4 positionCS       : SV_POSITION;
                float4 uv               : TEXCOORD0;
                float  fogCoord         : TEXCOORD1;
                float3 normalWS         : TEXCOORD2;
                float3 positionWS       : TEXCOORD3;
            };
 
            CBUFFER_START(UnityPerMaterial)
            half4 _BaseColor;       half _MaskFre , _sofLight ,_PowLight; half4 _uvSpeed;
            float4 _BaseMap_ST;
            CBUFFER_END
            TEXTURE2D (_BaseMap);SAMPLER(sampler_BaseMap);

            //菲尼尔反向模糊边缘
            half Fresnel(half3 N , half3 V , half Fres)
            {
                return pow(abs(1-(dot(N,V))), Fres);
            }

            Varyings vert(Attributes v)
            {
                Varyings o = (Varyings)0;
 
                o.positionCS  = TransformObjectToHClip(v.positionOS.xyz);
                o.normalWS    = TransformObjectToWorldNormal(v.normalOS.xyz);
                o.positionWS  = TransformObjectToWorld(v.positionOS.xyz);
                o.uv.xy = TRANSFORM_TEX(v.uv, _BaseMap);
                o.uv.zw = v.uv;
                o.fogCoord = ComputeFogFactor(o.positionCS.z);
 
                return o;
            }
 
            half4 frag(Varyings i) : SV_Target
            {
                //Mask
                float uv_col = i.uv.w*(pow(abs(1-i.uv.w),_MaskFre))*_MaskFre;

                half3 N = i.normalWS.xyz;
                half3 V = SafeNormalize(_WorldSpaceCameraPos - i.positionWS);
                float FresCol01 = 1-Fresnel(N,V,0.5);
                float FresCol02 = 1-Fresnel(N,-V,0.5);
                float FresCol = (FresCol01 + FresCol02)*_sofLight;

                //uv流动
                i.uv.xy = float2(i.uv.x+ _uvSpeed.x*_Time.y,i.uv.y+ _uvSpeed.y*_Time.y);
                half NoiseTex = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, i.uv.xy).r;

                float Mask = uv_col*NoiseTex* FresCol *_PowLight;
                

                float4 c = Mask * _BaseColor;
                c.rgb = MixFog(c.rgb, i.fogCoord);
                return c;
            }
            ENDHLSL
        }
    }
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是制作URP渲染管线下的溶解特的完整步骤: 1. 创建一个材质球:在Project面板中右键点击空白处,选择Create -> Material,然后将材质球命名为“Dissolve”,并将其Shader设置为“Universal Render Pipeline -> Dissolve”。 2. 创建一个溶解纹理:在Project面板中右键点击空白处,选择Create -> Render Texture,然后将Render Texture命名为“Dissolve Mask”,并设置其分辨率为256x256。在Inspector面板中,将Render Texture的Wrap Mode设置为Clamp,Filter Mode为Point,并将其勾选为“Generate Mip Maps”。 3. 创建一个溶解控制脚本:在Hierarchy面板中选择需要应用溶解特的物体,然后在Inspector面板中点击“Add Component”,选择New Script并将其命名为“DissolveControl”。在Script Editor中编写控制溶解特的代码。 4. 编写溶解控制脚本:在DissolveControl脚本中,需要定义溶解特的一些参数,如溶解速度、溶解纹理、溶解边缘等。然后,在Update函数中,根据需要控制溶解的进度,并将其应用到材质球中。 5. 应用材质球:将Dissolve材质球应用到需要应用溶解特的物体上。 6. 调整溶解参数:在Inspector面板中,调整材质球中的溶解参数,如溶解纹理、溶解速度、溶解边缘等,以达到预期的果。 通过以上步骤,就可以在URP渲染管线下制作出溶解特。需要注意的是,不同场景和需求下,溶解特的实现方式可能会略有不同,需要根据实际情况进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不吃斋的和尚

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

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

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

打赏作者

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

抵扣说明:

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

余额充值