当前位置: 首页 > news >正文

Unity URP支持多光源阴影

前文:Unity URPShader支持多光源处理

上文只是简单的实现了光照照亮效果,但是并没有实现多光源的阴影投射功能,接下来就是对此功能的整合。

接收阴影

//声明需要的变体和文件
//平行光的阴影
#pragma shader_feature _ _MAIN_LIGHT_SHADOWS _MAIN_LIGHT_SHADOWS_CASCADE
//额外光的阴影
#pragma shader_feature _ _ADDITIONAL_LIGHT_SHADOWS
//阴影质量选择
#pragma shader_feature _ _SHADOWS_SOFT _SHADOWS_SOFT_LOW _SHADOWS_SOFT_MEDIUM _SHADOWS_SOFT_HIGH#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
//shadowCoord 代表主光源平行光采样ShadowMap的阴影UV,shadowMask是额外光的遮罩
#if _RECEIVESHADOW_ONfloat4 shadowCoord = TransformWorldToShadowCoord(positionWS);o.shadowCoord = shadowCoord;#if defined(SHADOWS_SHADOWMASK) && defined(LIGHTMAP_ON)half4 shadowMask = inputData.shadowMask;#elif !defined(LIGHTMAP_ON)half4 shadowMask = unity_ProbesOcclusion;#elsehalf4 shadowMask = half4(1, 1, 1, 1);#endif
#endif
//顶点处理#ifdef _ADDITIONAL_LIGHTS_VERTEXuint pixelLightCount = GetAdditionalLightsCount();#if _RECEIVESHADOW_ONfor (uint lightIndex = 0u; lightIndex < pixelLightCount; ++lightIndex){Light light = GetAdditionalLight(lightIndex, positionWS, shadowMask);half3 attenuatedLightColor = light.color * (light.distanceAttenuation * (light.shadowAttenuation + 0.5));lightColor += LightingLambert(attenuatedLightColor, light.direction, o.normalWS);}#elsefor (uint lightIndex = 0u; lightIndex < pixelLightCount; ++lightIndex){Light light = GetAdditionalLight(lightIndex, positionWS);half3 attenuatedLightColor = light.color * (light.distanceAttenuation * (light.shadowAttenuation + 0.5));lightColor += LightingLambert(attenuatedLightColor, light.direction, o.normalWS);}#endif

额外光处理的主要函数是GetAdditionalLight(),可以在RealtimeLights hlsl文件中找到几个重载方法。

//片元处理//光照half3 lightColor = i.lightColor;#if _RECEIVESHADOW_ONLight main_light = GetMainLight(i.shadowCoord);half3 main_light_dir = normalize(main_light.direction);half diffuse_term = dot(normalize(i.normalWS), main_light_dir) * 0.5 + 0.5;lightColor += diffuse_term * main_light.color * (main_light.shadowAttenuation + 0.5);#ifdef _ADDITIONAL_LIGHTSuint pixelLightCount = GetAdditionalLightsCount();for (uint lightIndex = 0u; lightIndex < pixelLightCount; ++lightIndex){Light light = GetAdditionalLight(lightIndex, i.positionWS.xyz, i.shadowMask);half3 attenuatedLightColor = light.color * (light.distanceAttenuation * (light.shadowAttenuation + 0.5));lightColor += LightingLambert(attenuatedLightColor, light.direction, i.normalWS);}#endif#elseLight main_light = GetMainLight();half3 main_light_dir = normalize(main_light.direction);half diffuse_term = dot(normalize(i.normalWS), main_light_dir) * 0.5 + 0.5;lightColor += diffuse_term * main_light.color;#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 + 0.5));lightColor += LightingLambert(attenuatedLightColor, light.direction, i.normalWS);}#endif#endif

投射阴影

  Pass{Name "ShadowCaster"Tags { "LightMode" = "ShadowCaster" }ZWrite OnZTest LEqualColorMask 0Cull[_Cull]HLSLPROGRAM#pragma vertex vert#pragma fragment frag#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"struct Attributes{float4 positionOS : POSITION;float3 normalOS : NORMAL;};struct Varyings{float4 positionHS : SV_POSITION;};half3 _LightDirection;Varyings vert(Attributes v){Varyings o;float3 positionWS = TransformObjectToWorld(v.positionOS.xyz);float3 normalWS = TransformObjectToWorldNormal(v.normalOS.xyz);positionWS = ApplyShadowBias(positionWS, normalWS, _LightDirection);o.positionHS = TransformWorldToHClip(positionWS);#if UNITY_REVERSED_Zo.positionHS.z = min(o.positionHS.z, UNITY_NEAR_CLIP_VALUE);#elseo.positionHS.z = max(o.positionHS.z, UNITY_NEAR_CLIP_VALUE);#endifreturn o;}half4 frag(Varyings i) : SV_TARGET{return 0;}ENDHLSL}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • mpc_local_planner的编译问题
  • 搭建和使用OnFinality?
  • ML16_转移矩阵、平稳分布和详细平衡条件
  • uniapp插槽用法
  • 【出行计划 / 2】
  • 在SpringMVC中用fmt标签实现国际化/多语言
  • Express与SQLite集成教程:轻松实现数据库操作
  • 每周12600元奖金池,邀你与昇腾算力共舞,openMind开发者盛宴启幕!
  • 专利申请全攻略:一步一步详解申请流程
  • “Flash闪存”介绍 及 “SD NAND Flash”产品的测试含例程
  • 手撕Python之散列类型
  • n*n矩阵,输出矩阵中任意两点之间所有路径
  • 代码随想录第六天|454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和
  • Unity数据持久化 之 二进制存储法
  • 企业微信dll,最新版dll
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Brief introduction of how to 'Call, Apply and Bind'
  • extjs4学习之配置
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • Java小白进阶笔记(3)-初级面向对象
  • JS变量作用域
  • PHP面试之三:MySQL数据库
  • tab.js分享及浏览器兼容性问题汇总
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 初识MongoDB分片
  • 大整数乘法-表格法
  • 浮现式设计
  • 简单基于spring的redis配置(单机和集群模式)
  • 力扣(LeetCode)21
  • 使用common-codec进行md5加密
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 微服务核心架构梳理
  • 微服务入门【系列视频课程】
  • 正则表达式小结
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • ​Java并发新构件之Exchanger
  • ​如何防止网络攻击?
  • # Redis 入门到精通(一)数据类型(4)
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (24)(24.1) FPV和仿真的机载OSD(三)
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (4.10~4.16)
  • (C语言)共用体union的用法举例
  • (python)数据结构---字典
  • (笔记)M1使用hombrew安装qemu
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (九)c52学习之旅-定时器
  • (论文阅读11/100)Fast R-CNN
  • (一)RocketMQ初步认识
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .net core 控制台应用程序读取配置文件app.config
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)