首页 > 其他分享 >URP - 简单光照

URP - 简单光照

时间:2025-01-07 23:10:56浏览次数:1  
标签:normalWS light URP 简单 float4 BaseMap 光照 OUT

要点

 

公式中的相关变量的获取

1) 顶点法线方向

  VertexNormalInputs normalInputs = GetVertexNormalInputs(IN.normalOS.xyz);
  OUT.normalWS = normalInputs.normalWS;

 2) 光线方向

  Light light = GetMainLight();
  float3 lightDirWS = light.direction;

 3) 视角方向

  VertexPositionInputs positionInputs = GetVertexPositionInputs(IN.positionOS.xyz);
  OUT.viewDirWS = GetCameraPositionWS() - positionInputs.positionWS;

 

Shader "My/URP_SimpleLit" {
    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 //高光区域大小
    }

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

        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;
        CBUFFER_END

        ENDHLSL

        Pass {
            Tags { "LightMode" = "UniversalForward" } //该pass为渲染pass

            HLSLPROGRAM
            #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 { //片元着色器(逐像素)
                //计算主光(逐像素)
                Light light = GetMainLight();
                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 + specular;
                return float4(c, 1);
            }
            ENDHLSL
        } // Pass
    } // SubShader
}

 

参考

URP基础光照 - 简书

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

 

标签:normalWS,light,URP,简单,float4,BaseMap,光照,OUT
From: https://www.cnblogs.com/sailJs/p/18604999

相关文章

  • 使用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.......
  • 【Java教程】Day21-01 Web开发:深入HTTP协议与简单HTTP服务器编写
    今天,我们访问网站、使用App时,基本上都基于Web架构,这种架构叫做Browser/Server模式,简称BS架构。BS架构的核心特征在于,客户端仅需一个浏览器,所有应用程序的逻辑和数据都存储在服务器端。客户端通过浏览器发出请求,服务器将Web页面返回并展示给用户。Web页面通常具有很强的交互性,H......
  • 使用 WebGL 绘制一个简单的点和原理解析
    使用WebGL绘制一个简单的点,我们需要通过WebGL的管线来进行一系列的步骤。以下是实现的详细步骤和原理解析:WebGL绘制点的基本步骤初始化WebGL上下文首先,我们需要获取WebGL上下文,这样才能进行所有的绘图操作。通常,WebGL上下文是通过<canvas>元素获取的。编......
  • LeetCode 热题 HOT 100 (040/100)【宇宙最简单版】
    【动态规划】No.0312戳气球【困难】......
  • 【APP】5分钟上手基于BurpSuite的APP抓包
    step1手机和电脑连上同一个wifi  step2ipconfig-all查看电脑在WLAN下的IP这里为10.0.23.80step3bp设置监听的端口和ip,ip设置为上一步看到的ip step4bp导出证书 der后缀改为cer 传给手机 step5 在设置中搜索证书,按步骤安装证书  step6......
  • FastAPI简单使用
    一、简介FastAPI是一个高性能Web框架,用于构建API。主要特性:快速:非常高的性能,与NodeJS和Go相当快速编码:将功能开发速度提高约200%至300%更少的错误:减少约40%的人为错误直观:强大的编辑器支持,自动补全无处不在,调试时间更少简易:旨在易于使用和学习,减少阅读文档的时......
  • deeplearning4j~实现简单模型训练和测试
    DeepLearning4j(DL4J)是一个开源的深度学习库,专为Java和Scala设计。它可以用于构建、训练和部署深度学习模型。以下是关于如何使用DL4J的基本指南以及一个简单的模型训练示例。本例中使用了MNIST数据集,MNIST(modifiednationalinstituteofstandardandtechnology)数据......