Unity URPShader支持多光源处理

news/2024/9/25 4:27:04/
//声明变体并且引用文件
#pragma shader_feature  _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
//在数据结构体中声明需要使用的数据
struct Attributes
{float4 positionOS : POSITION;float2 texcoord : TEXCOORD0;#if defined(_ENABLELIGHTING_ON)float3 normalOS : NORMAL;#endif};struct Varyings
{float4 positionHS : SV_POSITION;float2 uv : TEXCOORD0;#if defined(_ENABLELIGHTING_ON)half3 lightColor : TEXCOORD1;#if defined(_ADDITIONAL_LIGHTS)float3 positionWS : TEXCOORD2;float3 normalWS : TEXCOORD3;#endif#endif
};

_ADDITIONAL_LIGHTS_VERTEX 是在顶点Shader中处理平行光额外增加的光源,_ADDITIONAL_LIGHTS是在片元Shader中处理平行光额外增加的光源

 顶点Shader:
//光照#if _ENABLELIGHTING_ONfloat3 normalWS = TransformObjectToWorldNormal(v.normalOS.xyz);Light main_light = GetMainLight();half3 main_light_dir = normalize(main_light.direction);half diffuse_term = dot(normalWS, main_light_dir) * 0.5 + 0.5;half3 lightColor = diffuse_term * main_light.color;#ifdef _ADDITIONAL_LIGHTS_VERTEXhalf3 vertexLight = VertexLighting(positionWS, normalWS);lightColor += vertexLight;#elif _ADDITIONAL_LIGHTSo.positionWS = positionWS;o.normalWS = normalWS;lightColor = half3(0, 0, 0);#endifo.lightColor = lightColor;#endif
片元Shader:
#if _ENABLELIGHTING_ON#ifdef _ADDITIONAL_LIGHTSuint pixelLightCount = GetAdditionalLightsCount();for (uint lightIndex = 0u; lightIndex < pixelLightCount; ++lightIndex){Light light = GetAdditionalLight(lightIndex, i.positionWS.xyz);half3 attenuatedLightColor = light.color * (light.distanceAttenuation * light.shadowAttenuation);i.lightColor += LightingLambert(attenuatedLightColor, light.direction, i.normalWS);}#endiffinal_color.rgb = i.lightColor * final_color.rgb;
#endif

也就是启用了_ADDITIONAL_LIGHTS_VERTEX宏

也就是启用了_ADDITIONAL_LIGHTS宏


http://www.ppmy.cn/news/1517665.html

相关文章

C语言——字符函数、字符串函数和内存函数

目录 1.字符分类函数 2.字符转换函数 3.字符串函数 3.1strlen 函数 3.1.1 strlen函数的模拟实现 3.1.1.1第一种方法&#xff1a;计算器方法 3.1.1.2 第二种方法&#xff1a;指针-指针 3.1.1.3 第三种方法&#xff1a;递归 3.2 strcpy 函数 3.2.1 strcpy函数的模拟实现…

DevOps实现CI/CD实战(四)- 集成Harbor

1. Harbor介绍 前面在部署项目时&#xff0c;我们主要采用Jenkins推送jar包到指定服务器&#xff0c;再通过脚本命令让目标服务器对当前jar进行部署&#xff0c;这种方式在项目较多时&#xff0c;每个目标服务器都需要将jar包制作成自定义镜像再通过docker进行启动&#xff0c…

面试官让简述一下elasticsearch

当面试官要求你简述 Elasticsearch 时,你可以从以下几个方面来介绍: 1. 简介 Elasticsearch 是一个分布式的、RESTful 风格的搜索和分析引擎,基于 Lucene 构建。它能够处理海量数据,提供近乎实时的全文搜索功能,并且可以轻松扩展到数百台服务器及 PB 级结构化或非结构化…

【React】React事件和HTML事件的区别

React写法 <button onClick{handleClick}>测试</button>HTML写法 <button onclick"handleClick()">测试</button>区别 ReactHTML原生事件绑定方式小驼峰命名法&#xff0c;事件处理函数通过 JSX 语法直接绑定全小写形式定义事件处理函数函…

C++ | Leetcode C++题解之第377题组合总和IV

题目&#xff1a; 题解&#xff1a; class Solution { public:int combinationSum4(vector<int>& nums, int target) {vector<int> dp(target 1);dp[0] 1;for (int i 1; i < target; i) {for (int& num : nums) {if (num < i && dp[i - …

git移动目录文件

移动目录文件是Git中常用的操作之一。下面我将从方法和操作流程两个方面来详细讲解。 方法一&#xff1a;使用Git命令行 下面是使用Git命令行移动目录文件的步骤&#xff1a; Step 1&#xff1a;打开Git命令行界面&#xff0c;进入到你的项目目录。 Step 2&#xff1a;使用g…

‌U盘闪一下就没了?‌如何有效恢复数据

在日常使用U盘的过程中&#xff0c;‌我们可能会遇到一种突发情况&#xff1a;‌U盘插入电脑后仅仅闪了一下就消失了&#xff0c;‌无法再被识别或访问。‌这种情况下&#xff0c;‌U盘中的数据似乎瞬间变得遥不可及。‌然而&#xff0c;‌不必过于担心&#xff0c;‌因为仍然有…

JS判断对象中是否存在某个属性

JS判断对象中是否存在某个属性 方式1&#xff1a;布尔判定方式2&#xff1a;使用undefined方式3&#xff1a;使用Object.keys()方式4&#xff1a;使用 hasOwnProperty()方式5&#xff1a;使用"in"总结: 方式1&#xff1a;布尔判定 var obj {}if (obj.a) {console.l…