Unity中Shader再议ATTENUATION

编程入门 行业动态 更新时间:2024-10-08 18:31:46

Unity中Shader<a href=https://www.elefans.com/category/jswz/34/1763877.html style=再议ATTENUATION"/>

Unity中Shader再议ATTENUATION

文章目录

  • 前言
  • 一、实现实时阴影的投射
    • 1、直接复制之前实现投射阴影的Pass
  • 二、实现实时阴影的接受,同时实现光照衰减
    • 1、在 v2f 中使用这个
    • 2、在 顶点着色器 中使用这个
    • 3、在 片元着色器 中使用这个


前言

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

  • Unity中Shader的GI的直接光实现
  • Unity中Shader的GI的间接光实现

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

在Distance 的 Shadowmask中,我们在设置的距离内使用的是实时阴影,所以,我们的Shader是不完善的


一、实现实时阴影的投射

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

  • Unity中Shader阴影的投射

注意:这里我们选择的 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);

更多推荐

Unity中Shader再议ATTENUATION

本文发布于:2023-11-16 02:51:47,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1611744.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:再议   Unity   Shader   ATTENUATION

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!