Unity SRP 管线【第三讲:URP 光照】

3.2.3 以前属于Shader部分,Shader部分不进行讲解。
这里只涉及Unity内部管线的设置问题。
文章目录
- 3.2.3 向GPU发送灯光数据
- 设置光源数据
- 设置主光源
- 设置额外点光源
- Shader中的数据
3.2.3 向GPU发送灯光数据
在UniversalRenderPipeline.cs > RenderSingleCamera()下调用函数renderer.Execute()

该函数走向ScriptableRenderer.cs>Execute()函数,该函数调用了SetupLights()函数

SetupLights()函数为一个虚函数

具体实现在UniversalRenderer.cs>SetupLights()中

该方法调用了m_ForwardLights实例下的_ForwardLights.Setup(context, ref renderingData);方法
URP中关于前向渲染的灯光设置,即在ForwardLights.cs中
SetUp()函数将来自于ref RenderingData renderingData中的灯光数据发送到GPU。
public void Setup(ScriptableRenderContext context, ref RenderingData renderingData)
{CommandBuffer cmd = CommandBufferPool.Get();using (new ProfilingScope(null, m_ProfilingSampler)){// 设置ClusteredRendering(Forward+)属性参数if (useClusteredRendering){...}// 设置Shader常量属性SetupShaderLightConstants(cmd, ref renderingData);// 设置Shader关键字bool lightCountCheck = (renderingData.cameraData.renderer.stripAdditionalLightOffVariants && renderingData.lightData.supportsAdditionalLights) || additionalLightsCount > 0;CoreUtils.SetKeyword(cmd, ShaderKeywordStrings.AdditionalLightsVertex,lightCountCheck && additionalLightsPerVertex && !useClusteredRendering);CoreUtils.SetKeyword(cmd, ShaderKeywordStrings.AdditionalLightsPixel,lightCountCheck && !additionalLightsPerVertex && !useClusteredRendering);CoreUtils.SetKeyword(cmd, ShaderKeywordStrings.ClusteredRendering,useClusteredRendering);...// 设置LightCookie(灯光遮罩)m_LightCookieManager.Setup(context, cmd, ref renderingData.lightData);}context.ExecuteCommandBuffer(cmd);CommandBufferPool.Release(cmd);
}
其中,关键字【ShaderKeywordStrings.AdditionalLightsVertex】 在 UniversalRenderPipelineCore中定义

设置光源数据
注意:这里使用引用传递传递RenderingData ,因为RenderingData 结构的数据量很大。
void SetupShaderLightConstants(CommandBuffer cmd, ref RenderingData renderingData)
{m_MixedLightingSetup = MixedLightingSetup.None;// 主光源有一个优化的主光源着色器路径。这将有利于那些只关心单一光线的游戏。// 通用管道也只支持单个阴影光,如果可用,它将是主光源。SetupMainLightConstants(cmd, ref renderingData.lightData);SetupAdditionalLightConstants(cmd, ref renderingData);
}
设置主光源
在ForwardLight中设置了如下GPU参数


void SetupMainLightConstants(CommandBuffer cmd, ref LightData lightData)
{Vector4 lightPos, lightColor, lightAttenuation, lightSpotDir, lightOcclusionChannel;uint lightLayerMask;// 根据visibleLights[mainLightIndex]数据,获取out的如下数据InitializeLightConstants(lightData.visibleLights, lightData.mainLightIndex, out lightPos, out lightColor, out lightAttenuation, out lightSpotDir, out lightOcclusionChannel, out lightLayerMask);// 将数据cmd.SetGlobalVector(LightConstantBuffer._MainLightPosition, lightPos);cmd.SetGlobalVector(LightConstantBuffer._MainLightColor, lightColor);cmd.SetGlobalVector(LightConstantBuffer._MainLightOcclusionProbesChannel, lightOcclusionChannel);cmd.SetGlobalInt(LightConstantBuffer._MainLightLayerMask, (int)lightLayerMask);
}
其中,InitializeLightConstants函数如下
void InitializeLightConstants(NativeArray<VisibleLight> lights, int lightIndex, out Vector4 lightPos, out Vector4 lightColor, out Vector4 lightAttenuation, out Vector4 lightSpotDir, out Vector4 lightOcclusionProbeChannel, out uint lightLayerMask)
{// 得到前5个数据UniversalRenderPipeline.InitializeLightConstants_Common(lights, lightIndex, out lightPos, out lightColor, out lightAttenuation, out lightSpotDir, out lightOcclusionProbeChannel);// 得到lightLayerMask lightLayerMask = 0;...lightLayerMask = (uint)additionalLightData.lightLayerMask;
}
设置额外点光源

额外光源与主光源相同,只是传入的数据是一个数组,数组长度与最大额外光源数相同。
核心函数:
InitializeLightConstants(lights, i, out m_AdditionalLightPositions[lightIter],out m_AdditionalLightColors[lightIter],out m_AdditionalLightAttenuations[lightIter],out m_AdditionalLightSpotDirections[lightIter],out m_AdditionalLightOcclusionProbeChannels[lightIter],out lightLayerMask);
Shader中的数据
在URP>Input.hlsl中可找到定义


之后便可以用这些光照数据计算着色~~~
相关文章:
Unity SRP 管线【第三讲:URP 光照】
3.2.3 以前属于Shader部分,Shader部分不进行讲解。 这里只涉及Unity内部管线的设置问题。 文章目录 3.2.3 向GPU发送灯光数据设置光源数据设置主光源设置额外点光源 Shader中的数据 3.2.3 向GPU发送灯光数据 在UniversalRenderPipeline.cs > RenderSingleCamera…...
怎么更新BI报表数据?问我就对了
BI大数据分析工具上有大量的BI报表模板,这些模板都是一个个完整的BI报表,只需将数据源更换,立即就能用来分析我们自己的数据。那,BI报表的数据怎么更新?接下来就来说说这事。 目的:更新BI报表数据 工具&a…...
SpringBoot 入门学习
开发环境配置 JDK 1.8、Maven 3.8.8、 IDEA CE 2023.2 框架介绍 Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置…...
高等数学零基础篇复习笔记
预备章 零基础高等数学入门知识 第一节 集合、运算与关系 第二节 三角函数与反三角函数 三角函数的公式 反三角函数 第三节 常见不等式及数列 划重点 第一章 函数、极限与连续 第一节 函数及函数的初等特性 特殊函数 反函数 函数的初等特性 ①有界性 ②奇偶性 偶函数图像…...
CentOS 系列:CentOS 7文件系统的组成
CentOS 7文件系统的组成 文件系统的组成Linux的一些重要目录文件和目录名主机名文件权限绝对路径和相对路径绝对路径相对路径 文件系统的组成 一切从根开始 文件路径中只有第一个/是根目录,后面的/是分隔符 文件名区分大小写 除斜线(/)以外,其他的字符…...
String转Date,Date转String
源码: Date currentTime new Date();System.out.println("currentTime:"currentTime);SimpleDateFormat formatter new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String dateString formatter.format(currentTime);System.out.println(&quo…...
大坝安全监测的内容及作用
大坝安全监测是指对大坝水雨情沉降、倾斜、渗压以及大坝形状特征有效地进行监测,及时发现潜在的安全隐患和异常情况,以便大坝管理人员能够做出科学决策,以确保大坝安全稳定运行。 大坝安全监测的主要内容 1.表面位移监测:监测大坝…...
Maven——Maven发展历程
本帖主要介绍以下内容: 什么是Maven为什么需要MavenMaven与极限编程 1、什么是Maven Maven这个词可以翻译为“知识的积累”,也可以翻译为“专家”或“内行”。Maven是跨平台的项目管理工具。作为Apache组织中的一个颇为成功的开源项目,Mav…...
Python与设计模式--迭代器模式
23种计模式之 前言 (5)单例模式、工厂模式、简单工厂模式、抽象工厂模式、建造者模式、原型模式、(7)代理模式、装饰器模式、适配器模式、门面模式、组合模式、享元模式、桥梁模式、(11)策略模式、责任链模式、命令模式、中介者模…...
【NGINX--8】HTTP/2
1、基本配置 想要利用 HTTP/2。 在 NGINX 服务器上启用 HTTP/2: server {listen 443 ssl http2 default_server;ssl_certificate server.crt; ssl_certificate_key server.key;# ... }详解 要启用 HTTP/2,您只需要将 http2 参数添加到 listen 指令即可…...
webpack项目工程初始化
一、初始化项目 默认系统已经安装node //初始化 pnpm init//安装webpack pnpm i -D webpack webpack-cli 新建一个index.html的入口文件 新建一个src文件存放js代码,src里面新建一个index.js package.josn配置打包命令 {"name": "webpack-cs&q…...
08-学成在线项目中统一异常处理的规范
项目中的异常处理 规范异常类型 在Service类的业务方法中有很多的参数合法性校验,当请求参数不合法的时候会抛出异常,但此时异常信息只会在控制台输出,前端界面并不会提示用户 实际开发中前端和后端需要做一些约定: 一般将错误提示信息统一以json格式返回给前端,以HTTP状态码…...
解析生效探测方法
linux dig命令 1.最常用的查询命令 dig baidu.com2 . 根据记录类型进行查询,比如MX,CNAME,NS,PTR等,只需将类型加在命令后面即可。 dig a.shifen.com ns3 . 指定域名DNS服务器测试解析是否生效的命令,以…...
【科技素养】蓝桥杯STEMA 科技素养组模拟练习试卷11
单选题 1、在阅读文章和接受信息时注意区分事实和观点十分重要。事实(或称为命题)不同于观点的一个主要特征是 A、可以被证实或证伪 B、是准确无误的 C、是正式的表达 D、表达了个人看法 答案:A 2、现代意义的知识产权是在多数国家都受…...
视频集中存储/磁盘阵列EasyCVR平台黑名单异常解决步骤是什么?
视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、…...
Spring Boot + MyBatis-Plus实现数据库读写分离
文章目录 1. 引言2. MyBatis-Plus简介3. 准备工作4. 配置数据源5. 配置MyBatis-Plus6. 创建实体类和Mapper接口7. 编写Service8. 控制器层9. 测试10. 数据库读写分离的原理11. 拓展11.1. 动态数据源11.2. 多数据源事务管理11.3. 多租户支持 12. 总结 🎉Spring Boot …...
数据同步异常处理,数据同步重试机制(Java)
一、应用场景 在数据同步时,偶尔会出现代码异常之外的问题。例如网络异常、服务器断电… 如果在以上异常片段中,原始数据库新增了一批数据,同步数据库则会丢失这部分数据 二、实现思路 为了解决以上问题,保证原始数据库操作的每…...
STM32F407-14.3.5-01捕获_比较通道
捕获/比较通道 每一个捕获/比较通道都是围绕着一个捕获/比较寄存器(包含影子寄存器) 包括: 捕获的输入部分(数字滤波、多路复用和预分频器), 输出部分(比较器和输出控制)。 中文参考手册中框图分成了三大模块, 把框图合并成了一个整体,以便更好的理解捕获输…...
【Python 训练营】N_12 打印菱形图案
题目 打印菱形图案 分析 先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重for循环,第一层控制行,第二层控制列。 答案 # 方法一 for i in range(4):block **(2*i1)print({:^7}.format(block))…...
risc-v异常处理
异常与中断的关系 中断和异常都为异常,分为: 同步异常:IO,illegal, page fault,miss_aligh 等来自处理器内部的发生的异常。异步异常(中断):鼠标,键盘,Time…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
