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


前言

在上一篇文章中,我们获取了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));

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-25 13:40:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-25 13:40:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-25 13:40:03       82 阅读
  4. Python语言-面向对象

    2024-01-25 13:40:03       91 阅读

热门阅读

  1. #Uniapp: uni.makePhoneCall(OBJECT) 拨打电话

    2024-01-25 13:40:03       58 阅读
  2. 5-分页实现

    2024-01-25 13:40:03       60 阅读
  3. vue2面试题:vue组件之间的通信方式有哪些?

    2024-01-25 13:40:03       47 阅读
  4. C++套接字编程

    2024-01-25 13:40:03       58 阅读
  5. Mysql 数据库(一)

    2024-01-25 13:40:03       57 阅读
  6. C#-正则表达式

    2024-01-25 13:40:03       48 阅读
  7. 克隆虚拟机之后网络IP冲突解决方法

    2024-01-25 13:40:03       63 阅读
  8. Qt防止创建窗口抢焦点

    2024-01-25 13:40:03       53 阅读