首页 > 其他分享 >URP - 阴影投射和接收

URP - 阴影投射和接收

时间:2025-01-07 23:24:44浏览次数:1  
标签:normalWS light 阴影 URP float4 投射 OUT

# URP_Shadow.shader

Shader "My/URP_Shadow" {
    Properties {
        _BaseMap("Texture", 2D) = "white" {} //主贴图
        _BaseColor("Tint Color", Color) = (1, 1, 1, 1) //混合颜色

        _Specular("Specular", Color) = (1, 1, 1, 1) //高光反射颜色
        _Gloss("Gloss", Range(8.0, 256)) = 20 //高光区域大小

        _Cutoff("Cutoff", float) = 0.5
    }

    SubShader {
        Tags {
            "RenderPipeline" = "UniversalPipeline" //声明这是URP专属shader
            "Queue" = "Geometry" //URP中不再决定渲染顺序(以前是序号越小越先渲染), 而仅仅是一个类别id
            "RenderType" = "Opaque"
        }
        LOD 100

        //所有pass共享的声明
        HLSLINCLUDE
        #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

        //所有属性都要缓存到CBuffer中, 这样才能兼容SRP Batcher
        CBUFFER_START(UnityPerMaterial)
            float4 _BaseMap_ST;
            float4 _BaseColor;
            float4 _Specular;
            float _Gloss;
            float _Cutoff;
        CBUFFER_END

        ENDHLSL

        Pass {
            Tags { "LightMode" = "UniversalForward" } //渲染pass, URP中在一个pass中渲染所有光源, 而不是内置管线的每个光源一个pass

            HLSLPROGRAM
            #pragma multi_compile _ _MAIN_LIGHT_SHADOWS //主光源阴影
            //#pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE //级联阴影(多张阴影贴图, 近处分辨率高, 远处分辨率低)
            #pragma multi_compile _ _SHADOWS_SOFT //阴影抗锯齿

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

            #pragma vertex vert //指定顶点着色器函数
            #pragma fragment frag //指定片元着色器函数

            struct Attributes { //程序传入顶点着色器的数据
                float4 positionOS : POSITION; //用模型空间顶点坐标填充该变量
                float4 normalOS : NORMAL; //用模型空间法线方向填充该变量
                float2 uv : TEXCOORD0; //用模型的第一套纹理坐标(uv)填充该变量
            };

            struct Varings { //顶点着色器传入片元着色器的数据
                float4 positionCS : SV_POSITION; //该变量存放了裁剪空间的顶点坐标
                float2 uv : TEXCOORD0;
                float3 positionWS : TEXCOORD1;
                float3 viewDirWS : TEXCOORD2;
                float3 normalWS : TEXCOORD3;
            };

            TEXTURE2D(_BaseMap);
            SAMPLER(sampler_BaseMap);

            Varings vert(Attributes IN) { //顶点着色器
                Varings OUT;

                VertexPositionInputs positionInputs = GetVertexPositionInputs(IN.positionOS.xyz); //顶点坐标从模型空间转其他空间
                OUT.positionCS = positionInputs.positionCS;
                OUT.positionWS = positionInputs.positionWS;

                OUT.viewDirWS = GetCameraPositionWS() - positionInputs.positionWS; //视角方向

                VertexNormalInputs normalInputs = GetVertexNormalInputs(IN.normalOS.xyz);
                OUT.normalWS = normalize(normalInputs.normalWS); //法线方向

                OUT.uv = TRANSFORM_TEX(IN.uv, _BaseMap); //应用贴图的tiling和offset
                return OUT;
            }

            float4 frag(Varings IN) : SV_Target { //片元着色器(逐像素)
                //计算主光
                float4 shadowCoord = TransformWorldToShadowCoord(IN.positionWS.xyz); //阴影坐标
                Light light = GetMainLight(shadowCoord);
                float3 lightDirWS = light.direction;
                half3 diffuse = LightingLambert(light.color, lightDirWS, IN.normalWS); //lambert方法计算漫反射贡献比例
                half3 specular = LightingSpecular(light.color, lightDirWS, normalize(IN.normalWS), normalize(IN.viewDirWS), _Specular, _Gloss); //Blinn-Phong方法计算高光

                //计算附加光照
                uint pixelLightCount = GetAdditionalLightsCount();
                for (uint lightIndex = 0; lightIndex < pixelLightCount; ++lightIndex) {
                    Light light = GetAdditionalLight(lightIndex, IN.positionWS);
                    diffuse += LightingLambert(light.color, light.direction, IN.normalWS);
                    specular += LightingSpecular(light.color, light.direction, normalize(IN.normalWS), normalize(IN.viewDirWS), _Specular, _Gloss);
                }

                half4 texColor = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, IN.uv); //根据纹理坐标获取像素颜色
                half3 albedo = texColor.rgb * _BaseColor.rgb; //物体本身颜色的最大反射率
                half3 c = albedo * diffuse * light.shadowAttenuation + specular;
                clip(texColor.a - _Cutoff);
                return float4(c, 1);
            }
            ENDHLSL
        } // end of Pass

        Pass {
            Name "ShadowCaster"
            Tags { "LightMode" = "ShadowCaster" } //声明该pass为阴影投射pass

            ZWrite On //深度写入
            ZTest LEqual //深度测试, 当前z值<=缓存中的值时通过
            Cull[_Cull] //剔除

            HLSLPROGRAM
            #pragma prefer_hlslcc gles //默认gles没用HLSLcc编译, gles 2.0要用urp标准库, 也要用HLSLcc编译
            #pragma exclude_renderers d3d11_9x //directX的renderer不使用这部分URP pass
            #pragma target 2.0

            // -------------------------------------
            // Material Keywords
            #pragma shader_feature _ALPHATEST_ON
            #pragma shader_feature _GLOSSINESS_FROM_BASE_ALPHA

            //--------------------------------------
            // GPU Instancing
            #pragma multi_compile_instancing

            #pragma vertex ShadowPassVertex
            #pragma fragment ShadowPassFragment

            //由于这段代码中声明了自己的CBUFFER,与我们需要的不一样,所以我们注释掉他
            //#include "Packages/com.unity.render-pipelines.universal/Shaders/SimpleLitInput.hlsl"
            //它还引入了下面2个hlsl文件
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/SurfaceInput.hlsl"

            #include "Packages/com.unity.render-pipelines.universal/Shaders/ShadowCasterPass.hlsl"
            ENDHLSL
        } // end of Pass

    } // end of SubShader

}

 

 

参考

从Built-in到URP - 简书

【Unity Shader】在URP里写Shader(三):URP简单光照Shader - 知乎

【Unity Shader】Builtin升级URP初探(一) - 知乎

URP多光源阴影处理 - 简书

 

Unity可编程渲染管线(SRP)教程:四、聚光灯阴影 - 知乎

级联阴影贴图(CSM)_csm级联阴影-CSDN博客图形渲染_洛阳李四的博客-CSDN博客

【URP CatlikeCoding学习笔记】4/17 —— 直接光阴影 1/4部分 - 知乎

 

标签:normalWS,light,阴影,URP,float4,投射,OUT
From: https://www.cnblogs.com/sailJs/p/18605164

相关文章

  • URP - 简单光照
    要点这边只涉及光源的漫反射和高光。漫反射(Diffuse)使用了Lambert方法来计算,高光(Specular)使用了Blin-Phone方法来计算,参考:Shader入门精要笔记-CH6_最简单的逐像素Blinn-Phong光照 公式中的相关变量的获取:1)顶点法线方向 VertexNormalInputsnormalInputs=GetVe......
  • 使用Burp Suite中的Intruder模块中设置有效载荷
    在BurpSuite的Intruder模块中设置有效载荷(Payload)是攻击测试的关键步骤,以下是详细的设置方法:一、进入有效载荷设置界面首先,你需要将目标请求发送到Intruder模块(如之前所述,通过在Proxy拦截的请求上右键点击并选择“SendtoIntruder”)。然后,在Intruder模块中,切换到......
  • 使用 Burp Suite 进行 SQL 注入测试
    一、原理SQL注入是一种通过将恶意的SQL代码插入到应用程序的输入参数中,从而利用数据库漏洞来执行非预期的SQL命令的攻击方式。BurpSuite能够帮助安全测试人员模拟这种攻击场景,通过修改请求中的参数,发送包含潜在SQL注入代码的请求,并观察目标应用程序的响应,以判断是否存在......
  • 使用Burp Suite中的Scanner模块进行漏洞扫描
    使用BurpSuite中的Scanner模块进行漏洞扫描可以按照以下步骤进行(以下操作基于BurpSuiteCommunity版本):一、配置代理打开BurpSuite,在主界面找到“Proxy”(代理)选项卡并点击进入。确保“Proxy”模块中的“Intercept”(拦截)按钮是处于“Interceptison”(拦截开启)状......
  • 使用Burp Suite中的Intruder模块进行攻击
    使用BurpSuite中的Intruder模块进行攻击,可按如下步骤操作:一、配置代理与浏览器代理(同Scanner模块操作第一步、第二步)打开BurpSuite,进入“Proxy”选项卡,确保“Intercept”处于“Interceptison”状态,并在“Options”中确认代理监听地址(如127.......
  • 【APP】5分钟上手基于BurpSuite的APP抓包
    step1手机和电脑连上同一个wifi  step2ipconfig-all查看电脑在WLAN下的IP这里为10.0.23.80step3bp设置监听的端口和ip,ip设置为上一步看到的ip step4bp导出证书 der后缀改为cer 传给手机 step5 在设置中搜索证书,按步骤安装证书  step6......
  • 安全测试工具burpsuite使用
    一、BurpSuite简介及安装BurpSuite是用于攻击web应用程序的集成平台,它包含了许多Burp工具,这些不同的burp工具通过协同工作,有效的分享信息,支持以某种工具中的信息为基础供另一种工具使用的方式发起攻击。它主要用来做安全性渗透测试,可以实现拦截请求、BurpSpider爬虫、漏洞扫......
  • Burp Sutie光标位移
    问题描述在使用BurpSutie应该都会出现的一个问题就是光标位移,如下图光标位置应是位于0.7的后面,但是在显示在0的后面。原因是因为显示器分辨率过大,软件自适应缩放导致的。解决方法手动设置软件分辨率方法一在启动的脚本-jar前面里添加参数调整程序缩放设置为1,注意每个参数......
  • 弱密码与BurpSuite爆破
    1、弱口令2、弱口令的分类常见的数据库密码:rootroot123、123456tomcatjboss3、暴力破解用暴力方式进行破解后台系统登录界面爆破SQL注入万能密码xss未授权访问扫子域名js文件4、Burpsuite的使用和用bp爆破密码设置https代理插件导入证书成功bp......
  • 《Burp Suite:Web安全测试的全能利器》
    burp激活BurpSuite是一款功能强大的Web应用程序安全测试工具,它集成了多个模块,用于拦截、分析和修改HTTP/HTTPS流量,帮助安全专家识别和修复潜在的安全漏洞。软件版本说明1、如果是初次下载,建议统一使用本文介绍中的版本。2、因为新版的Burp要求的JDK版本较高,有可能......