urp SpotLight 衰减方式扩展

news/2024/7/7 19:52:30

背景

解决默认spotLight 的衰减模式下, 在距离灯光特别近的时候,灯光过爆的情况

解决方法

修改SpotLight的衰减方式

下图是unity给出的几种衰减模式以及图示:

其中InverseSquare是当前2021.2 unity版本中urp(12.1.6)所使用的衰减方案

该衰减方案在图中可以看出 在距离最近的地方, 颜色有点过于爆。

为了方便项目在其他场景的时候, 添加了Legacy和Linear的衰减方案, 以供选择。

核心代码修改:RealtimeLights.hlsl中的DistanceAttenuation方法。

// 在原代码的基础上,添加了attenType , 用来标识当前灯光所使用的衰减方案

// 0 : InverseSquare , 1 : Linear , 2 :Legacy

// 在原代码的基础上,添加了attenType , 用来标识当前灯光所使用的衰减方案
// 0 : InverseSquare , 1 : Linear , 2 :Legacy
float DistanceAttenuation(float distanceSqr, half2 distanceAttenuation, half attenType = 0)
{
    // We use a shared distance attenuation for additional directional and puctual lights
    // for directional lights attenuation will be 1
    float lightAtten = rcp(distanceSqr);
    float2 distanceAttenuationFloat = float2(distanceAttenuation);

#if SHADER_HINT_NICE_QUALITY
    // Use the smoothing factor also used in the Unity lightmapper.
    half factor = half(distanceSqr * distanceAttenuationFloat.x);
    half smoothFactor = saturate(half(1.0) - factor * factor);
    smoothFactor = smoothFactor * smoothFactor;
#else
    // We need to smoothly fade attenuation to light range. We start fading linearly at 80% of light range
    // Therefore:
    // fadeDistance = (0.8 * 0.8 * lightRangeSq)
    // smoothFactor = (lightRangeSqr - distanceSqr) / (lightRangeSqr - fadeDistance)
    // We can rewrite that to fit a MAD by doing
    // distanceSqr * (1.0 / (fadeDistanceSqr - lightRangeSqr)) + (-lightRangeSqr / (fadeDistanceSqr - lightRangeSqr)
    // distanceSqr *        distanceAttenuation.y            +             distanceAttenuation.z
    half smoothFactor = half(saturate(distanceSqr * distanceAttenuationFloat.x + distanceAttenuationFloat.y));
#endif
    if(attenType == 2)
    {
        return smoothFactor * smoothFactor;
    }
    return lerp( lightAtten*smoothFactor, smoothFactor , attenType);
    
}

attenType 怎么来的?

urp工程中每个light组件下都会有一个UniversalAdditionLight的脚本, 我们可以在这个脚本中添加AttenType并且把数值传递到RealtimeLight中。

数值的传递在脚本ForwardLights中,详细的可以看代码进行扩展。

最终结果:

通过挂接脚本, 来修改当前灯光的AttenType,从而实现spotLight衰减方式的更换


http://lihuaxi.xjx100.cn/news/950540.html

相关文章

操作系统权限提升(十九)之Linux提权-SUID提权

系列文章 操作系统权限提升(十八)之Linux提权-内核提权 SUID提权 SUID介绍 SUID是一种特殊权限,设置了suid的程序文件,在用户执行该程序时,用户的权限是该程序文件属主的权限,例如程序文件的属主是root,那么执行该…

Java学习--网络编程

1. 网络编程入门 1.1 网络编程概述 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统…

动态规划初阶-爬楼梯问题

示例1: 输入:cost [10,15,20] 输出:15 解释:你将从下标为 1 的台阶开始。 - 支付 15 ,向上爬两个台阶,到达楼梯顶部。 总花费为 15 。示例2: 输入:cost [1,100,1,1,1,100,1,1,10…

C语言易错小贴士

1.数组建立以及strlen: char arr1[]"bit"; char arr2[]{b,i,t}; char arr3[]{b,i,t,\0}; 1)其中arr1数组需要注意默认为4个字符,和arr3包含的内容是一致的; 2)arr2末尾没有\0,后面是数组越界的…

【数据结构(四)】树

文章目录树1 树的基本概念1.1 树的定义1.2 基本术语1.3 数的性质2 二叉树的概念2.1 二叉树的定义与特性2.1.1 定义2.1.2 二叉树的性质2.2 几种特殊的二叉树2.2.1 满二叉树2.2.2 完全二叉树2.3 二叉树的存储结构2.3.1 顺序存储2.3.2 链式存储3 二叉树的遍历和线索二叉树3.1 二叉…

cast提前!最简单有效的神经网络优化方法,没有之一!

做优化有时候真的很头疼,绞尽脑汁的想怎么做算法等价,怎么把神经网络各层指令流水起来,在确保整网精度的同时,又有高性能。 但有时做了半天,却发现流水根本就流不起来,总是莫名其妙地被卡住。 真的是一顿…

PHP使用chilkat入门教程

前言: 我们需要先确认自己的版本,在PHP中,可以利用phpinfo()函数来查看php是ts版本还是nts版本,该方法可以展示出当前phpinfo信息,若“Thread Safety”项的信息是“enabled”,一般来说就表示ts版本&#xf…

数学小课堂:微积分复盘(高等数学本质上是对趋势的动态描述,是对各种相关性抽象的表述。)

文章目录 引言I 复盘1.1 概念和表述1.2 现实与虚构1.3 有穷和无穷1.4 静态和动态1.5 直觉和逻辑II 通过数学逻辑,理解人生。2.1 精明与聪明2.2 朋友和理性的对手2.3 攒钱和赚钱2.4 荣誉和财富引言 高等数学本质上是对趋势的动态描述,是对各种相关性抽象的表述。 I 复盘 1.…