Unity中URP下额外灯角度衰减

news2024/11/18 17:20:09

文章目录

  • 前言
  • 一、额外灯中聚光灯的角度衰减
  • 二、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;

  • 平方前
    请添加图片描述

  • 平方后
    请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1413493.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【DevOps】Jenkins Extended E-mail 邮件模板添加自定义变量

文章目录 1、配置Jenkins邮箱2、配置告警模板1、配置Jenkins邮箱 略 2、配置告警模板 自定义变量:DYSK_PYTEST_STATUS // Uses Declarative syntax to run commands inside a container. pipeline {agent {kubernetes {cloud "kubernetes" //选择名字是kuberne…

2024年上海高考数学最后四个多月的备考攻略,目标140+

亲爱的同学们,寒假已经来临,春节即将到来,距离2024年上海高考已经余额不足5个月了。作为让许多学子头疼,也是拉分大户的数学科目,你准备好了吗?今天,六分成长为您分享上海高考数学最后四个多月的…

武忠祥2025高等数学,基础阶段的百度网盘+视频及PDF

考研数学武忠祥基础主要学习以下几个方面的内容: 1.微积分:主要包括极限、连续、导数、积分等概念,以及它们的基本性质和运算方法。 2.线性代数:主要包括向量、向量空间、线性方程组、矩阵、行列式、特征值和特征向量等概念,以及它们的基本…

Bluetooth Device Address(BD_ADDR) - 2

蓝牙核心规范:Core v5.3中关于蓝牙地址的其他说明 Vol 3: Host, Part C: Generic Access Profile 3 User interface aspects 3.2 Representation of Bluetooth parameters 3.2.1 Bluetooth Device Address (BD_ADDR) BD_ADDR 是蓝牙设备使用的地址。在设备发现过…

Linux中断 -- 中断路由、优先级、数据和标识

目录 1.中断路由 2.中断优先级 3.中断平衡 4.Linux内核中重要的数据结构 5.中断标识 承前文,本文从中断路由、优先级、数据结构和标识意义等方面对Linux内核中断进行一步的解析。 1.中断路由 Aset affinity flow GIC文中有提到SPI类型中断的路由控制器寄存器为…

01 Redis的特性+下载安装启动+客户端连接

1.1 NoSQL NoSQL(“non-relational”, “Not Only SQL”),泛指非关系型的数据库。 键值存储数据库 : 就像 Map 一样的 key-value 对。如Redis文档数据库 : NoSQL 与关系型数据的结合,最像关系…

南昌市青山湖、滕王阁、洛阳路隧道FM调频广播集群通信调度系统应用案例

一、用户需求 青山湖隧道,是南昌市一条东西走向的城市主干道,隧道为双向6车道,长1070米,其中湖底暗埋段为550米,净高5.45米,两孔每孔净宽12.4米。 滕王阁隧道是南昌市沿江北大道与沿江中大道连通工程&#…

智能分析网关V4智慧机房:视频AI智能安全监管方案

一、背景分析 随着互联网的迅猛发展,机房及其配套设施的数量持续攀升,它们的运行状况对于企业运营效率和服务质量的影响日益显著。作为企业信息化的基石,机房的安全监测与管理的重要性不容忽视。它不仅关乎企业的稳定运营,同时也直…

Redis6基础知识梳理~

初识NOSQL: NOSQL是为了解决性能问题而产生的技术,在最初,我们都是使用单体服务器架构,如下所示: 随着用户访问量大幅度提升,同时产生了大量的用户数据,单体服务器架构面对着巨大的压力 NOSQL解…

ctf-idea调试jar包

0.拿到jar包并解压 进入解压出来的目录,然后以该目录打开项目 1.设置maven 设不设置都行 2.添加依赖 添加两个依赖, boot-inf下的 classes和lib 3.配置调试器 添加 remote jvm debug 1.根据jdk版本选择调试参数 2.选择module classpath为解压后的文件夹名 如图,运行jar包的…

【Deeplabv3+】Ubutu18.04中使用pytorch复现Deeplabv3+第三步)-----CityscapesScripts生成自己的标签

本文是在前面两篇文章的基础上,讲解如何更改训练数据集颜色,需要与前面两篇文章连起来看。 本文用于修改cityscapes数据集的标签颜色与Semankitti数据集的标签一致,对修改后的数据集进行训练。需要下载两个开发工具包和一个数据集&#xff0…

免费交互式大模型在线图像去除水印.擦除.替换和增强照片项目代码(免费在线图像修复工具)

图像修复工具:基于SOTA人工智能模型的应用 原始图: 擦出不想要区域 结果展示 并继续擦除 怎么样神奇把,水印也同样神奇的效果!!! 想要了解更多,请看下文! ! 基于S…

安全小记-ngnix负载均衡

目录 一.配置ngnix环境二.nginx负载均衡 一.配置ngnix环境 本次实验使用的是centos7,首先默认yum源已经配置好,没有配置好的自行访问阿里云镜像站 https://developer.aliyun.com/mirror/ 接着进行安装工作 1.首先创建Nginx的目录并进入: mkdir /soft &…

Qt编写手机端视频播放器/推流工具/Onvif工具

一、视频播放器 同时支持多种解码内核,包括qmedia内核(Qt4/Qt5/Qt6)、ffmpeg内核(ffmpeg2/ffmpeg3/ffmpeg4/ffmpeg5/ffmpeg6)、vlc内核(vlc2/vlc3)、mpv内核(mpv1/mp2)、…

淘宝扭蛋机小程序:新时代的互动营销与娱乐体验

随着科技的快速发展,小程序已经成为人们日常生活中不可或缺的一部分。在众多的小程序中,淘宝扭蛋机小程序以其独特的互动性和趣味性,吸引了大量用户。本文将深入探讨淘宝扭蛋机小程序的特色、用户体验以及未来发展。 一、淘宝扭蛋机小程序的…

【深度学习】【AutoDL】【SSH】通过VSCode和SSH使用AutoDL服务器训练模型

身边没有显卡资源或不足以训练模型时,可以租赁服务器的显卡。 1、注册AutoDL并配置环境 首先打开AutoDL官网,注册账号并租赁自己期望的显卡资源 点击“租赁”之后,我们要继续选择基础环境。此处,我们让其自动配置好基础的pytor…

用Visual Studio Code创建JavaScript运行环境【2024版】

用Visual Studio Code创建JavaScript运行环境 JavaScript 的历史 JavaScript 最初被称为 LiveScript,由 Netscape(Netscape Communications Corporation,网景通信公司)公司的布兰登艾奇(Brendan Eich)在 …

【C/C++】详解程序环境和预处理(什么是程序环境?为什么要有程序环境?如何理解程序环境?)

目录 一、前言 二、 什么是程序环境? 三、 为什么要有程序环境? 四、如何理解程序环境? 🍎 ANSI C 标准 🍐 翻译环境和执行环境 五、详解翻译环境和执行环境 🍇翻译环境(重点&#xff01…

【K12】tk窗口+plt图像功能-学习物理中的串并联研究【附源码说明】

程序源码 import tkinter as tk import matplotlib.pyplot as plt# 初始化 matplotlib 的字体设置 plt.rcParams[font.family] SimHei# 计算串联电路的函数 def calculate_series():try:# 获取用户输入的电阻值并转换为浮点数r1 float(entry_r1.get())r2 float(entry_r2.ge…

Kotlin Multiplatform项目推荐 | 太空人分布图

Kotlin Multiplatform项目推荐 | 太空人分布图 项目简介 Kotlin Multiplatform项目是一种跨平台开发技术,它可以同时使用SwiftUI、Jetpack Compose、Compose for Wear OS、Compose for Desktop、Compose for Web、Kotlin/JS React等客户端框架,并且使…