当前位置: 首页 > 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…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

day52 ResNet18 CBAM

在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]

报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践,很多人以为AI已经强大到不需要程序员了,其实不是,AI更加需要程序员,普通人…...