Unity中Shader再议ATTENUATION

本文介绍了如何在Unity中实现实时光照阴影的投射和接受,包括复制阴影投射Pass,使用DistanceShadowmask技术,并结合光照衰减,通过调整顶点和片元着色器来实现实时阴影效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

在之前文章中,实现了 Global Illumination 的直接光照 和 间接光照后,我们发现,虽然烘焙的光照 和 阴影 有了。

但是,删除烘焙贴图后,我们会发现 模型没有 实时投影 和 实时接收阴影。

在Distance 的 Shadowmask中,我们在设置的距离内使用的是实时阴影,所以,我们的Shader是不完善的
请添加图片描述


一、实现实时阴影的投射

1、直接复制之前实现投射阴影的Pass

在这里插入图片描述

注意:这里我们选择的 GI 方案 是 Distance 的 Shadowmask

//阴影的投射
        Pass
        {
            //1、设置 "LightMode" = "ShadowCaster"
            Tags{"LightMode" = "ShadowCaster"}
            CGPROGRAM
            
            #pragma vertex vert
            #pragma fragment frag
            //需要添加一个 Unity变体
            #pragma multi_compile_shadowcaster

            
            #include "UnityCG.cginc"

            //声明消融使用的变量
            float _Clip;
            sampler2D _DissolveTex;
            float4 _DissolveTex_ST;
            
            //2、appdata中声明float4 vertex:POSITION;和half3 normal:NORMAL;这是生成阴影所需要的语义.
            //注意:在appdata部分,我们几乎不要去修改名字 和 对应的类型。
            //因为,在Unity中封装好的很多方法都是使用这些标准的名字
            struct appdata
            {
                float4 vertex:POSITION;
                half3 normal:NORMAL;
                float4 uv:TEXCOORD;
            };
            //3、v2f中添加V2F_SHADOW_CASTER;用于声明需要传送到片断的数据.
            struct v2f
            {
                float4 uv : TEXCOORD;
                V2F_SHADOW_CASTER;
            };
            //4、在顶点着色器中添加TRANSFER_SHADOW_CASTER_NORMALOFFSET(o),主要是计算阴影的偏移以解决不正确的Shadow Acne和Peter Panning现象.
            v2f vert(appdata v)
            {
                v2f o;
                o.uv.zw = TRANSFORM_TEX(v.uv,_DissolveTex);
                TRANSFER_SHADOW_CASTER_NORMALOFFSET(o);
                return o;
            }
            //5、在片断着色器中添加SHADOW_CASTER_FRAGMENT(i)
            
            fixed4 frag(v2f i) : SV_Target
            {
                //外部获取的 纹理 ,使用前都需要采样
                fixed4 dissolveTex = tex2D(_DissolveTex,i.uv.zw);
                
                //片段的取舍
                clip(dissolveTex.r -  _Clip);
                
                SHADOW_CASTER_FRAGMENT(i);
            }
            ENDCG
        }

这时,我们就可以看见 阴影投射 的效果。但是,还没有阴影接收的效果

请添加图片描述


二、实现实时阴影的接受,同时实现光照衰减

计算阴影后,赋值给 giInput.atten

在这里插入图片描述

因为我们想实现 采集阴影 和 光照衰减的效果,所以不使用之前的采样阴影方案
在这里插入图片描述
我们使用一个同时实现光照衰减 和 阴影采样 的通用方案

1、在 v2f 中使用这个

1、使用 阴影采样 和 光照衰减的方案的 第一步
//同时定义灯光衰减以及实时阴影采样所需的插值器
UNITY_LIGHTING_COORDS(2,3)

2、在 顶点着色器 中使用这个

2、使用 阴影采样 和 光照衰减的方案的 第二步
UNITY_TRANSFER_LIGHTING(o,v.lightmapUV.xy)

3、在 片元着色器 中使用这个

//1、代表灯光的衰减效果
//2、实时阴影的采样
UNITY_LIGHT_ATTENUATION(atten,i,i.worldPos);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

楠溪泽岸

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

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

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

打赏作者

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

抵扣说明:

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

余额充值