Unity SRP 管线【第九讲:URP 点光源与聚光灯】

文章目录

  • CPU数据搜集
  • GPU数据使用
  • 光照计算

在这里插入图片描述

CPU数据搜集

我们只能支持有限数量的其他灯。并将这些灯光数据(位置、颜色、阴影强度、方向光光源、灯光遮蔽Probe、灯光层级Mask)发送到GPU以供场景中所有物体渲染使用。

//ForwardLights.cs
在这里插入图片描述
额外光源数量与使用的平台以及API有关

  • 如果是移动端 并且 使用OpenGLES2、OpenGLES3(小于OpenGLES30版本),则最大额外光源数为16
  • 否则,如果是移动端 或着 PC端使用OpenGLCore、OpenGLES2、OpenGLES3,则最大额外光源数为32
  • 否则,最大额外光源数为256(即PC端使用OpenGL3.0以上版本、或其他API)

//UniversalRenderPipeline.cs
在这里插入图片描述
遍历场景获取所有光源数据

// ForwardLights.cs
//Setup() > SetupShaderLightConstants() > SetupAdditionalLightConstants()
循环遍历所有光源
在这里插入图片描述
InitializeLightConstants() > InitializeLightConstants_Common()
处理单个光源数据,获取数据保存到LightConstantBuffer中

关于SpotLight的衰减值,定义在
//UniversalRenderPipelineCore.cs
在这里插入图片描述
最终,将Buffer发送到GPU
在这里插入图片描述

GPU数据使用

输入的光线信息变量保存在Input.hlsl
在这里插入图片描述
获取这些信息的函数保存在realtimeLights.hlsl

// Fills a light struct given a perObjectLightIndex
Light GetAdditionalPerObjectLight(int perObjectLightIndex, float3 positionWS)

因为我们计算逐个对象需要的并不是所有光源,而是对该对象贡献最大的几个光源(Unity中一般设置为4个),因此,需要告诉管线我们需要这些数据。
在drawingSettings 中设置

perObjectData |= PerObjectData.LightData | PerObjectData.LightIndices;

即可得到Unity定义在UnityInput中的数据

// Light Indices block feature
// These are set internally by the engine upon request by RendererConfiguration.
half4 unity_LightData;
half4 unity_LightIndices[2];

half4 unity_LightData;

  • x : GetPerObjectLightIndexOffset(),一般为0
  • y:影响单个物体灯光的数量保存在unity_LightData.y。GetAdditionalLightsCount(),该数量可能超过最大渲染灯光数。
  • z: light.distanceAttenuation = unity_LightData.z; // unity_LightData.z is 1 when not culled by the culling mask, otherwise 0.

half4 unity_LightIndices[2];
每个需要计算的灯光下标保存在half4 unity_LightIndices[2]中,共8个int,因此最大支持每个物体8个光源。
该下标通过RealtimeLights.hlsl中的GetPerObjectLightIndex()获得

int GetPerObjectLightIndex(uint index)
{
//一般情况float4 tmp = unity_LightIndices[index / 4];return int(tmp[index % 4]);
}

额外光源信息获取,全套使用流程:

#if defined(_ADDITIONAL_LIGHTS)uint pixelLightCount = GetAdditionalLightsCount();LIGHT_LOOP_BEGIN(pixelLightCount)// lightIndexLight light = GetAdditionalLight(lightIndex, inputData, shadowMask, aoFactor);if (IsMatchingLightLayer(light.layerMask, meshRenderingLayers)){lightingData.additionalLightsColor += LightingPhysicallyBased(brdfData, brdfDataClearCoat, light,inputData.normalWS, inputData.viewDirectionWS,surfaceData.clearCoatMask, specularHighlightsOff);}LIGHT_LOOP_END
#endif

其中使用的函数:

  1. 获取额外光源数量(_AdditionalLightsCount.x为我们设置的对象可接受的最大额外光源数)
int GetAdditionalLightsCount()
{
#if USE_CLUSTERED_LIGHTING// Counting the number of lights in clustered requires traversing the bit list, and is not needed up front.return 0;
#else// TODO: we need to expose in SRP api an ability for the pipeline cap the amount of lights// in the culling. This way we could do the loop branch with an uniform// This would be helpful to support baking exceeding lights in SH as wellreturn int(min(_AdditionalLightsCount.x, unity_LightData.y));
#endif
}
  1. 获取光源下标后,获取光照信息
Light GetAdditionalLight(uint i, float3 positionWS)
{
#if USE_CLUSTERED_LIGHTINGint lightIndex = i;
#elseint lightIndex = GetPerObjectLightIndex(i);
#endifreturn GetAdditionalPerObjectLight(lightIndex, positionWS);
}

光照计算

此处便不再说明光照计算

unity会根据是否添加额外光照,添加关键字_ADDITIONAL_LIGHTS

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

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

相关文章

qt内存自动释放的两种情况

qt内存管理机制 QObject的parent 我们时常能看到QWidget或者其他的控件的构造函数中有一项参数parent,默认值都为NULL,例如: QLineEdit(const QString &contents, QWidget *parent nullptr); QWidget(QWidget *parent nullptr, Qt::…

vue3学习——初始化项目及配置

初始化项目 环境 node 16pnpm 8.0.0 命令 pnpm create vite进行以下选择 👇 – 项目名 – VUe – Ts – cd/目录 – pnpm run dev 浏览器自动打开 package.json 配置eslint 安装依赖包 pnpm i eslint -D npx eslint --init // 生成配置文件进行以下选择 &a…

【2024】大三寒假再回首:缺乏自我意识是毒药,反思和回顾是解药

2024年初,学习状态回顾 开稿时间:2024-1-23 归家百里去,飘雪送客迟。 搁笔日又久,一顾迷惘时。 我们饱含着过去的习惯,缺乏自我意识是毒药,反思和回顾是解药。 文章目录 2024年初,学习状态回顾一…

vue——实现多行粘贴到table事件——技能提升

最近在写后台管理系统时,遇到一个需求,就是要从excel表格中复制多行内容,然后粘贴到后台系统中的table表格中。 如下图所示:一次性复制三行内容,光标放在红框中的第一个框中,然后按ctrlv粘贴事件&#xff0…

掌上医院预约挂号缴费系统源码,与医院信息系统共享数据,实现在线预约挂号、移动支付、医保支付、检验检查报告查看、门诊病历查询等功能。

随着信息技术的发展和互联网的普及,越来越多的患者开始习惯于通过互联网获取医疗服务。网上预约挂号是近年来开展的一项便民就医服务,旨在缓解看病难、挂号难的就医难题,许多患者为看一次病要跑很多次医院,最终还不一定能保证看得…

MySQL数据控制语言DCL

MySQL数据控制语言DCL 目录 MySQL数据控制语言DCLDCL关键字1.事务事务的四大特性START TRANSACTION:开始事务ROLLBACK:回滚COMMIT:提交事务 2.用户权限CREATE USER:创建新的用户并指定权限DROP USER:删除用户ALTER USE…

深度强化学习(王树森)笔记10

深度强化学习(DRL) 本文是学习笔记,如有侵权,请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接:https://github.com/wangshusen/DRL 源代码链接:https://github.c…

LeetCode —— 17. 电话号码的字母组合

😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️Take your time ! 😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️…

基于人体姿态的目标追踪实现

文章目录 概要人体姿态识别人体关键点转检测框实时跟踪器概要 这篇博文简单介绍了如何实现基于人体姿态的多目标跟踪算法。主要分为以下几个步骤: 基于FastDeploy实现人体姿态识别;将人体姿态转化为检测框;基于SORT算法实现目标跟踪。人体姿态识别 参考Fastdeploy实现。 模…

Ubuntu系统硬盘分区攻略(磁盘分区、RAID磁盘阵列、RAID阵列、固态硬盘分区、机械硬盘分区、swap分区、swap交换分区)

文章目录 分区需求分区方案分区顺序相关疑问swap分区不是应该放在最后吗?我安装系统分区的时候,上面有available devices,下面有create software raid(md),我该用哪个?我available devices下面有个893G的固态&#xff…

Selenium自动化测试 —— 模拟鼠标键盘的操作事件

鼠标操作事件 在实际的web产品测试中,对于鼠标的操作,不单单只有click(),有时候还要用到右击、双击、拖动等操作,这些操作包含在ActionChains类中。 ActionChains类中鼠标操作常用方法: 首先导入ActionChains类&#…

Python OpenCV实现图片像素区域缩放

Python OpenCV实现图片像素区域缩放 前言项目安装OpenCV和Pillow思路代码编写 前言 遇到一个要将大量图片缩放成统一规格的难题,并且这些图片周围还有很多空白像素,所以用Python实现一下。 项目 安装OpenCV和Pillow pip install opencv-python pip …

C++:异常体系

异常体系 异常1.C语言传统的处理错误的方式2.C异常概念3.异常的使用3.1异常的抛出和捕获3.2 异常的重新抛出3.3异常安全3.4 异常规范 4.C标准库的异常体系5.异常的优缺点 异常 1.C语言传统的处理错误的方式 终止程序,如assert,缺陷:用户难以…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之TextClock组件

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之TextClock组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、TextClock组件 TextClock组件通过文本将当前系统时间显示在设备上。支持不同…

Pytorch从零开始实战18

Pytorch从零开始实战——人脸图像生成 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——人脸图像生成环境准备模型定义开始训练可视化总结 环境准备 本文基于Jupyter notebook,使用Python3.8,Pytorch2.0.1cu118&#…

【2024年美赛即将开赛】最后一天如何提高获奖率

美赛思路预定 01 美赛赛中时间分配美赛时间安排比赛前2~3天第一天(2号)第二天(3号)第三天(4号)第四天(5号)第五天(6号)8:00~10:00 02 …

Hadoop-生产调优(更新中)

第1章 HDFS-核心参数 1.1 NameNode内存生产配置 1)NameNode 内存计算 每个文件块大概占用 150 byte,一台服务器 128G 内存为例,能存储多少文件块呢? 128 * 1024 * 1024 * 1024 / 150byte ≈ 9.1 亿G MB KB Byte 2&#xff09…

前端构建变更:从 webpack 换 vite

现状 这里以一个 op (内部运营管理用)项目为例,从 webpack 构建改为 vite 构建,提高本地开发效率,顺便也加深对 webpack 、 vite 的了解。 vite 是前端构建工具,使用 一系列预配置进行rollup 打包&#x…

gdb 调试 - 在vscode图形化展示在远程的gdb debug过程

前言 本地机器的操作系统是windows,远程机器的操作系统是linux,开发在远程机器完成,本地只能通过ssh登录到远程。现在目的是要在本地进行图形化展示在远程的gdb debug过程。(注意这并不是gdb remote !!&am…

实现vue3响应式系统核心-shallowReactive

简介 今天来实现一下 shallowReactive 这个 API。 reactive函数是一个深响应,当你取出的值为对象类型,需要再次调用 reactive进行响应式处理。很明显我们目前的代码是一个浅响应,即 只代理了对象的第一层,也就是 shallowReactiv…