Unity中URP下计算额外灯的方向

文章目录

  • 前言
  • 一、为什么额外灯的方向,不像主平行灯一样直接获取?
    • 1、主平行灯
    • 2、额外灯中,包含 点光源、聚光灯 和 平行灯
  • 二、获得模型顶点指向额外灯的单位向量
  • 三、Unity中的实现


前言

在上一篇文章中,我们获取了URP下额外灯的数据。

  • Unity中URP下获取每一个额外灯数据

在这篇文章中,我们用获取到的数据来计算额外灯的方向。


一、为什么额外灯的方向,不像主平行灯一样直接获取?

1、主平行灯

  • 对于模型的每一个顶点来说,无论顶点位置在哪?我们主平行灯的方向都是不会改变的
    在这里插入图片描述
  • 我们使用的是,模型顶点指向主平行灯,他们的方向也是一致的
    在这里插入图片描述

2、额外灯中,包含 点光源、聚光灯 和 平行灯

  • 点光源 和 聚光灯

对于这两种额外灯类型来说:
照射到模型每一个顶点上,额外灯的方向是不一致的,都需要单独计算

在这里插入图片描述
我们使用的是模型顶点指向 额外灯
在这里插入图片描述

  • 平行灯
    和主平行光实例图一样

二、获得模型顶点指向额外灯的单位向量

  • 在这里Unity没有使用normalise函数归一化,而是使用了原始的方法
    在这里插入图片描述
  • 模型顶点指向额外光:
  • l i g h t V e c t o r = l i g h t P o s i t i o n W S − p o s i t i o n W S lightVector = lightPositionWS - positionWS lightVector=lightPositionWSpositionWS
  • 向量归一化:
  • l i g h t D i r e c t i o n = l i g h t V e c t o r ∣ l i g h t V e c t o r ∣ = l i g h t V e c t o r 1 l i g h t V e c t o r ⋅ l i g h t V e c t o r lightDirection = \frac{lightVector}{\lvert lightVector\rvert}=lightVector\frac{1}{\sqrt{lightVector·lightVector}} lightDirection=lightVectorlightVector=lightVectorlightVectorlightVector 1

三、Unity中的实现

在这里插入图片描述

  • 计算得到顶点指向额外灯的方向
  • lightPositionWS.w:代表额外灯类型(平行光=0,点灯=1)

float3 lightVector = lightPositionWS.xyz - positionWS * lightPositionWS.w;

  • 防止 点积 出现零在分母的情况,对其取了一个最大值

float distanceSqr = max(dot(lightVector, lightVector), HALF_MIN);

  • 最后,带入公式: l i g h t D i r e c t i o n = l i g h t V e c t o r ∣ l i g h t V e c t o r ∣ lightDirection = \frac{lightVector}{\lvert lightVector\rvert} lightDirection=lightVectorlightVector,得到额外灯方向单位向量

half3 lightDirection = half3(lightVector * rsqrt(distanceSqr));

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索Gin框架:快速构建高性能的Golang Web应用

前言 Gin框架是一个轻量级的Web框架,基于Go语言开发,旨在提供高性能和简洁的API。它具有快速的路由和中间件支持,使得构建Web应用变得更加简单和高效。无论是构建小型的API服务还是大型的Web应用,Gin框架都能够满足你的需求。 无论…

vivado I/O和时钟规划设计流程步骤

I/O和时钟规划设计流程步骤 下图显示了左侧的项目设计流程步骤。水平箭头表示项目设计流程中可以执行I/O和时钟规划的点。中的步骤I/O和时钟规划设计流程如右图所示。 项目设计流程从一个空的I/O规划项目、RTL设计项目或合成后网表项目。使用这些项目类型中的任何一种&#xf…

【江科大】STM32:USART串口(理论部分)上

串口 全双工:可以进行同步通信 单端信号:信号线传输的就是单端信号。(也就是与地线(GND)的电势差) 缺点:防干扰能力差 原因:当信号从A点传输到B点,理想条件是A&#xff0…

Unity 解决异步分发方案

很多程序,包括游戏、小程序、一些AR、VR的程序,因为客户端体量太大,更新频繁都涉及到远程热更新的问题,解决这类问题的思路基本上是客户端解决主要功能,资源类放置在服务器。 下面记录下: 1.CDN或者云轻量…

探讨Go语言中的HTTP代理模式:看Go如何玩转网络中转站

在互联网的海洋中,HTTP代理服务器像一座灯塔,为我们的网络冲浪提供了指引。而当Go语言遇上HTTP代理,会碰撞出怎样的火花呢?今天,让我们一起探讨Go语言中的HTTP代理模式,看看它如何玩转这个网络中转站&#…

BGV/BFV 的统一自举算法

参考文献: [GV23] Geelen R, Vercauteren F. Bootstrapping for BGV and BFV Revisited[J]. Journal of Cryptology, 2023, 36(2): 12.Bit Extraction and Bootstrapping for BGV/BFV 文章目录 Bootstrapping for BGV and BFVDecryption FunctionBGVBFV Bootstrapp…

项目管理中,项目经理如何预防需求蔓延?

在项目管理中,需求蔓延是一个常见的问题,需求蔓延可能会导致项目进度延误、成本增加和产品质量下降。为了防止这种情况发生,项目经理需要采取一系列措施来预防需求蔓延。 一、明确项目范围和需求 项目经理需要在项目开始阶段明确项目范围和…

【云原生】Docker 网络

目录 Docker 网络实现原理 查看容器的输出和日志信息 Docker 的网络模式: 使用docker run创建Docker容器时,可以用 --net 或 --network 选项指定容器的网络模式 网络模式详解 1.host模式 2.container模式 --name 选项可以…

【开源】基于JAVA+Vue+SpringBoot的婚恋交友网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 会员管理模块2.3 新闻管理模块2.4 相亲大会管理模块2.5 留言管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 会员信息表3.2.2 新闻表3.2.3 相亲大会表3.2.4 留言表 四、系统展示五、核心代码5.…

数据结构之二叉树的遍历

数据结构是程序设计的重要基础,它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发,分析和研究计算机加工的数据的特性,以便为应用所涉及的数据选择适当的逻辑结构、存储结构及其相应的操作方法…

STM32F407移植OpenHarmony笔记1

参考文档: OpenAtom OpenHarmonywidthdevice-width,initial-scale1.0https://docs.openharmony.cn/pages/v3.2/zh-cn/device-dev/get-code/gettools-acquire.md/ 搭建环境 安装linux系统: Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-91-generic x86_64) 下载源代码&a…

【服务器GPT+MJ+GPTs】创建部署GPT+MJ+GPTs程序网站

目录 🌺【前言】 🌺【准备】 🌺【宝塔搭建GPT+MJ+GPTs】 🌼1. 给服务器添加端口 🌼2. 安装宝塔 🌼3. 安装Docker 🌼4. 安装ChatGPT程序 🌼5. 程序更新 🌼6. 修改端口 | 密码 🌼7. 绑定域名+申请SSL证书 🌺【前言】 相信大家都对openai的产品ch…

【洛谷】P1443 马的遍历(BFS)

由于在 x,y 表示 x 行 y 列还是 y 行 x 列上存在歧义,另外提供一组测试数据: // input: 5 5 2 3// output: 1 2 3 2 1 2 3 0 3 2 1 2 3 2 1 4 1 2 1 4 3 2 3 2 3 可以说&…

Qt基础-窗体添加图标

本文演示Qt窗体如何添加图标 创建项目添加资源文件 打开窗体的设计窗口 选择windowIcon属性,点击下箭头-选择资源,选择资源文件,(格式不受限制) 点击OK即可 运行看效果

【小呆的力学笔记】弹塑性力学的初步认知二:应力应变分析(2)

文章目录 1.4 主应力空间、八面体应力1.5 应变分析1.6 特殊应力、应变定义 1.4 主应力空间、八面体应力 一点的应力状态不论如何变化,其主应力和主方向一致的话,该点的应力状态就是唯一确定的。因此,我们用主应力方向建立一个三维坐标系来描…

【Linux】基础命令及测试工作常用

一、Linux基础命令 【基础】 tab补全 chtrlc停止进程 绝对路径: 以 / 开头,从根目录下开始寻找路径 相对路径: 不以 / 开头,从当前目录下开始寻找 1、系统管理相关命令 ifconfig 显示或设置网络设备的命令,我们可…

[实战]加密传输数据解密

前言 下面将分享一些实际的渗透测试经验,帮助你应对在测试中遇到的数据包内容加密的情况。我们将以实战为主,技巧为辅,进入逆向的大门。 技巧 开局先讲一下技巧,掌握好了技巧,方便逆向的时候可以更加快速的找到关键函数…

mybatisplus做SQL拦截添加自定义排序

前言 工作中写的一段代码,备个份,以后兴许能直接用 功能描述:如果前端传入了排序规则,则优先按传入的字段进行排序,SQL原有的排序规则追加到末尾 注:我们项目里的分页查询,是基于XML的SQL执行的…

RedisInsight详细安装教程

简介 RedisInsight 是一个直观高效的 Redis GUI 管理工具,它可以对 Redis 的内存、连接数、命中率以及正常运行时间进行监控,并且可以在界面上使用 CLI 和连接的 Redis 进行交互(RedisInsight 内置对 Redis 模块支持)。 RedisIn…

第四篇【传奇开心果短博文系列】Python的OpenCV库技术点案例示例:机器学习

传奇开心短博文系列 系列短博文目录Python的OpenCV库技术点案例示例系列短博文 短博文目录一、项目目标二、OpenCV机器学习介绍三、OpenCV支持向量机示例代码四、OpenCV支持向量机示例代码扩展五、OpenCVK均值聚类示例代码六、OpenCVK均值聚类示例代码扩展七、OpenCV决策树示例…