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

Unity中URP下额外灯角度衰减

文章目录

  • 前言
  • 一、额外灯中聚光灯的角度衰减
  • 二、AngleAttenuation函数的传入参数
    • 1、参数:spotDirection.xyz
    • 2、_AdditionalLightsSpotDir
    • 3、参数:lightDirection
    • 4、参数:distanceAndSpotAttenuation.zw
    • 5、_AdditionalLightsAttenuation
  • 三、AngleAttenuation函数的程序体
    • 1、我们先来看一下SdotL的结果
    • 2、cosOuterAngle:聚光灯外圈与聚光灯夹角的余弦值
    • 3、cosInnerAngle:聚光灯内圈与聚光灯夹角角的余弦值
    • 4、最后,就可以使用公式来计算了
    • 5、但是,我们在程序体中,看见的却是这样一句话
    • 6、最终、Unity还对其做了平方处理,目的是加强角度衰减效果


前言

在上一篇文章中,我们推导了URP下额外灯的距离衰减。

  • Unity中URP下额外灯的距离衰减

在这篇文章中,我们推导一下URP下额外灯的角度衰减。角度衰减只有在聚光灯中才有用。


一、额外灯中聚光灯的角度衰减

  • 衰减包括:距离衰减 和 角度衰减
  • 我们这篇文章主要分析 角度衰减,角度衰减是聚光灯独有的。

AngleAttenuation1(spotDirection.xyz, lightDirection, distanceAndSpotAttenuation.zw);

在这里插入图片描述


二、AngleAttenuation函数的传入参数

  • 调用

AngleAttenuation1(spotDirection.xyz, lightDirection, distanceAndSpotAttenuation.zw);

1、参数:spotDirection.xyz

  • 该参数是通过内置变量获取的
    在这里插入图片描述

  • 该内置变量是C#提前计算好的
    在这里插入图片描述

2、_AdditionalLightsSpotDir

  • 我们来看一下C#中怎么计算得出该参数
    在这里插入图片描述
    在这里插入图片描述
  • 一开始会赋值一个聚光灯方向默认值
    在这里插入图片描述
  • k_DefaultLightSpotDirection,默认值为(0,0,1,0)
    在这里插入图片描述
  • 非平行灯下,在对距离衰减修改后,还会判断是否是聚光灯
  • 是聚光灯,则会修改聚光灯方向的默认值
    在这里插入图片描述
  • 修改时,会获取聚光灯方向,并对其取反
    在这里插入图片描述

3、参数:lightDirection

  • 之前计算出的,额外光方向的单位向量
    在这里插入图片描述

4、参数:distanceAndSpotAttenuation.zw

  • 该参数是读取的内置参数
    在这里插入图片描述
  • 该内置变量是C#提前计算好的
    在这里插入图片描述

5、_AdditionalLightsAttenuation

  • 我们来看一下C#中,怎么计算该参数
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

三、AngleAttenuation函数的程序体

在这里插入图片描述

  • 角度衰减公式: a n g l e A t t e n u a t i o n = S d o t L − c o s O u t e r A n g l e c o s I n n e r A n g l e − c o s O u t e r A n g l e angleAttenuation=\frac{SdotL - cosOuterAngle} {cosInnerAngle - cosOuterAngle} angleAttenuation=cosInnerAnglecosOuterAngleSdotLcosOuterAngle

  • 我们先看一下这些参数分别代表什么

  • SdotL:S(聚光灯方向的相反方向)点积 L(指向聚光灯方向单位向量)

  • cosOuterAngle:聚光灯外圈与聚光灯夹角的余弦值

  • cosInnerAngle :聚光灯内圈与聚光灯夹角角的余弦值

1、我们先来看一下SdotL的结果

  • 我们可以看出目标点越靠近聚光灯中心,我们的结果越趋向 1,则越亮
    请添加图片描述

2、cosOuterAngle:聚光灯外圈与聚光灯夹角的余弦值

  • C#中提前把角度取Unity传入的一半,然后转弧度,再计算余弦值
  • 取一半的原因是,我们传入的值是需要的角的两倍
    在这里插入图片描述

在这里插入图片描述

请添加图片描述

3、cosInnerAngle:聚光灯内圈与聚光灯夹角角的余弦值

  • C#中提前把角度取Unity传入的一半,然后转弧度,再计算余弦值
  • 取一半的原因是,我们传入的值是需要的角的两倍
    在这里插入图片描述
  • 我们主要看非特效情况下
    在这里插入图片描述
    请添加图片描述

4、最后,就可以使用公式来计算了

  • 角度衰减公式: a n g l e A t t e n u a t i o n = S d o t L − c o s O u t e r A n g l e c o s I n n e r A n g l e − c o s O u t e r A n g l e angleAttenuation=\frac{SdotL - cosOuterAngle} {cosInnerAngle - cosOuterAngle} angleAttenuation=cosInnerAnglecosOuterAngleSdotLcosOuterAngle

  • 该公式其实只是起到了 平滑曲线过渡的作用
    在这里插入图片描述

  • 该公式的作用:限制最后余弦值的结果,还达到了平滑过渡的效果

  • 当 targetPos 夹角大于 outerDir 的夹角时,余弦值反而小了,则取outerDir夹角余弦值来替代
    在这里插入图片描述

  • 当 targetPos 夹角小于 innerDir 的夹角时,余弦值反而大了,则取innerDir夹角余弦值来替代

在这里插入图片描述

5、但是,我们在程序体中,看见的却是这样一句话

在这里插入图片描述

  • 原因在于,这是Unity为了节省性能,对该公式进行了化简

a n g l e A t t e n u a t i o n = S d o t L − c o s O u t e r A n g l e c o s I n n e r A n g l e − c o s O u t e r A n g l e angleAttenuation=\frac{SdotL - cosOuterAngle} {cosInnerAngle - cosOuterAngle} angleAttenuation=cosInnerAnglecosOuterAngleSdotLcosOuterAngle

= S d o t L c o s I n n e r A n g l e − c o s O u t e r A n g l e − c o s O u t e r A n g l e c o s I n n e r A n g l e − c o s O u t e r A n g l e =\frac{SdotL } {cosInnerAngle - cosOuterAngle}-\frac{cosOuterAngle} {cosInnerAngle - cosOuterAngle} =cosInnerAnglecosOuterAngleSdotLcosInnerAnglecosOuterAnglecosOuterAngle

= S d o t L ∗ 1 c o s I n n e r A n g l e − c o s O u t e r A n g l e + − c o s O u t e r A n g l e c o s I n n e r A n g l e − c o s O u t e r A n g l e =SdotL*\frac{1} {cosInnerAngle - cosOuterAngle}+\frac{-cosOuterAngle} {cosInnerAngle - cosOuterAngle} =SdotLcosInnerAnglecosOuterAngle1+cosInnerAnglecosOuterAnglecosOuterAngle

  • Unity在C#中,对其提前进行了计算
  • 使 d i s t a n c e A n d S p o t A t t e n u a t i o n . z = 1 c o s I n n e r A n g l e − c o s O u t e r A n g l e distanceAndSpotAttenuation.z=\frac{1} {cosInnerAngle - cosOuterAngle} distanceAndSpotAttenuation.z=cosInnerAnglecosOuterAngle1
  • 使 d i s t a n c e A n d S p o t A t t e n u a t i o n . w = − c o s O u t e r A n g l e c o s I n n e r A n g l e − c o s O u t e r A n g l e distanceAndSpotAttenuation.w =\frac{-cosOuterAngle} {cosInnerAngle - cosOuterAngle} distanceAndSpotAttenuation.w=cosInnerAnglecosOuterAnglecosOuterAngle
    在这里插入图片描述
    在这里插入图片描述

6、最终、Unity还对其做了平方处理,目的是加强角度衰减效果

return atten * atten;

  • 平方前
    请添加图片描述

  • 平方后
    请添加图片描述

相关文章:

Unity中URP下额外灯角度衰减

文章目录 前言一、额外灯中聚光灯的角度衰减二、AngleAttenuation函数的传入参数1、参数:spotDirection.xyz2、_AdditionalLightsSpotDir3、参数:lightDirection4、参数:distanceAndSpotAttenuation.zw5、_AdditionalLightsAttenuation 三、A…...

BKP备份寄存器、RTC实时时钟

目录 1. BKP (Backup Registers)备份寄存器 2. RTC (Real Time Clock)实时时钟 1. BKP (Backup Registers)备份寄存器 BKP可用于存储用户应用程序数据。当VDD (2.0-3.6V)电源被切断,他们仍然由VBAT (1.8-3.6V)维持供电。当系统在待机模式下被唤醒,或系统复位或…...

k8s 进阶实战笔记 | Scheduler 调度策略总结

文章目录 Scheduler 调度策略总结调度原理和过程调度策略nodeSelect亲和性和反亲和性NodeAffinify亲和验证PodAffinity 亲和验证PodAntiAffinity 反亲和验证污点与容忍跳过 Scheduler 调度策略 调度策略场景总结 Scheduler 调度策略总结 调度原理和过程 Scheduler 一直监听着…...

微服务-微服务Spring-cloud-open-feign

1. LoadBalancerRestTemplate的缺陷 LoadBalancerRestTemplate进行微服务调用 BeanLoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}//调用方式String url "http://mall-order/order/findOrderByUserId/"id;R result restTemplate.…...

分类预测 | Matlab实现DT决策树多特征分类预测

分类预测 | Matlab实现DT决策树多特征分类预测 目录 分类预测 | Matlab实现DT决策树多特征分类预测分类效果基本描述程序设计参考资料分类效果...

随机点名--好玩哦

大屏滚动,随机点名,可刺激哦 想屏幕名字滚动得快一点,sleep时间就小一点 效果图 代码 #!/bin/bash namefile"/opt/name.txt" linenum$(sed -n $ $namefile) while : docleartmp$(sed -n "$[RANDOM%linenum1]p" $namefi…...

Linux下的进程操作

进程概念 ps -elf:查看操作系统的所有进程(Linux命令) ctrl z:把进程切换到后台 crtl c:结束进程 fg:把进程切换到前台 获取进程进程号和父进程号 函数原型: pid_t getpid(void); //pid_t…...

uniapp scroll-view用法[下拉刷新,触底事件等等...](4)

前言:可滚动视图区域。用于区域滚动 话不多说 直接上官网属性 官网示例 讲一下常用的几个 scroll 滚动时触发 scrolltoupper 滚动到顶部或左边,会触发 scrolltoupper 事件 scrolltolower 滚动到底部或右边,会触发 scrolltolower 事件 1.纵向滚动…...

聊聊大模型 RAG 探索之路的血泪史,一周出Demo,半年用不好

大家好,今天我们来继续看看 RAG 落地的一些有趣的事儿,从技术社群早上的讨论开始,喜欢技术交流的可以文末加入我们 一、从一周出Demo、半年用不好说起 最近读了读2024-傅盛开年AI大课,其中有讲到RAG环节,三张片子比较…...

UniApp 生命周期详解

UniApp 是一个使用 Vue.js 开发所有前端应用的框架,它可以编译到 iOS、Android、H5、小程序等多个平台。在 UniApp 中,生命周期是指应用或页面从创建到销毁的过程中所经历的一系列阶段。了解生命周期可以帮助开发者更好地管理资源、优化性能和提升用户体…...

用大模型训练实体机器人,谷歌推出机器人代理模型

谷歌DeepMind的研究人员推出了一款,通过视觉语言模型进行场景理解,并使用大语言模型来发出指令控制实体机器人的模型——AutoRT AutoRT可有效地推理自主权和安全性,并扩大实体机器人学习的数据收集规模。在实验中,AutoRT指导超过…...

HCIA-HarmonyOS设备开发认证-2.设备开发入门

目录 HarmonyOS设备开发学习路径一、开发项目与工具介绍1.1、设备开发环境准备1.2、设备开发流程1.3、Huawei DevEco Device Tool 二、OpenHarmony介绍OpenHarmony目录结构详细介绍applications目录详解base目录详解foundation目录详解 OpenHarmony接口分层介绍CMSIS 和 POSIX …...

2. HarmonyOS 应用开发 DevEco Studio 准备-2

2. HarmonyOS 应用开发 DevEco Studio 准备-2 首选项设置 中文设置 主题 字体 插件安装和使用 保存时操作 编辑器 工程树管理 代码树管理 标记 字符串可视化编辑 参考文档 常用快捷键 编辑 查找或替换 编译与运行 调试 其他 预览 页面预览 自定义组件预览 预览…...

【K8S 云原生】K8S的图形化工具——Rancher

目录 一、rancher概述 1、rancher概念 2、rancher和K8S的区别: 二、实验 1、安装部署 2、给集群添加监控: 3、创建命名空间: 4、创建deployment: 5、创建service: 6、创建ingress: 7、创建hpa 8…...

3. SQL 语言

重点: MySQL 的 三种安装方式:包安装,二进制安装,源码编译安装。 MySQL 的 基本使用 MySQL 多实例 DDLcreate alter drop DML insert update delete DQL select 3)SQL 语言 3.1)关系型数据库的常见…...

Android音量调节修改

前言 今日公司,安卓设备的音量显示不正常,让我来修复这个bug,现在已修复,做个博客,记录一下,以后碰到类似一下子就好解决。 Android音量调节相关 路径 frameworks\base\services\core\java\com\android…...

九州金榜|为什么鼓励式家庭教育?

鼓励式教育是一种积极的教育方式,它强调通过鼓励和肯定来激发孩子的积极性和自信心,帮助孩子更好地成长和发展。在家庭教育中,鼓励式教育同样具有重要意义。九州金榜家庭教育和大家一起探讨关于鼓励式教育的好处以及意义: 一.有助…...

Java复习系列之阶段二:数据库

1. 基础语法 1.1 DQL(数据查询语句) 执行顺序: from、join 、on、where、group by、having、select、distinct、order by、limit 1.2 DML(数据修改语言) 对数据表的增删改 insert into update set delete form 1.…...

TCP 异常断开连接【重点】

参考链接 https://xiaolincoding.com/network/3_tcp/tcp_down_and_crash.html https://xiaolincoding.com/network/3_tcp/tcp_unplug_the_network_cable.html#%E6%8B%94%E6%8E%89%E7%BD%91%E7%BA%BF%E5%90%8E-%E6%9C%89%E6%95%B0%E6%8D%AE%E4%BC%A0%E8%BE%93 关键词&#xff1a…...

Biotin-PEG4-TSA,生物素-PEG4-酪胺,用于标记蛋白质、核酸等生物分子

您好,欢迎来到新研之家 文章关键词:Biotin-PEG4-Tyramide,Biotin-PEG4-TSA,生物素-PEG4-酪胺,Biotin PEG4 Tyramide,Biotin PEG4 TSA 一、基本信息 产品简介:Biotin PEG4 Tyramide is compos…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

基于Springboot+Vue的办公管理系统

角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...

【网络安全】开源系统getshell漏洞挖掘

审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...