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中可找到定义
在这里插入图片描述
在这里插入图片描述

之后便可以用这些光照数据计算着色~~~

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

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

相关文章

叠加原理(superposition principle)

叠加原理&#xff08;superposition principle&#xff09;指对线性系统而言&#xff0c;两个或多个输入产生的输出&#xff0c;等于这几个输入单独引起的输出的和&#xff0c;即输入的叠加等于各输入单独引起的输出的叠加。 例如&#xff0c;如果输入产生的输出是&#xff0c;…

如何使用nginx部署静态资源

Nginx可以作为静态web服务器来部署静态资源&#xff0c;这个静态资源是指在服务端真实存在&#xff0c;并且能够直接展示的一些文件数据&#xff0c;比如常见的静态资源有html页面、css文件、js文件、图片、视频、音频等资源相对于Tomcat服务器来说&#xff0c;Nginx处理静态资…

大数据面试大厂真题【附答案详细解析】

1.Java基础篇&#xff08;阿里、蚂蚁、字节、携程、快手、杭州银行等&#xff09; 问题&#xff1a;HashMap的底层实现原理 答案&#xff1a; 在jdk1.8之前&#xff0c;hashmap由 数组-链表数据结构组成&#xff0c;在jdk1.8之后hashmap由 数组-链表-红黑树数据结构组成&…

②⑩② 【读写分离】Sharding - JDBC 实现 MySQL读写分离[SpringBoot框架]

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ Sharding-JDBC Sharding-JDBC介绍使用 Shardin…

DistilBERT模型训练实战

LLM似乎正在接管世界&#xff0c;但许多人仍然不真正理解他们是如何运作的。 我从事机器学习工作已有几年&#xff0c;并且对自然语言处理和最近的进展非常着迷。 尽管我阅读了大部分随附的论文&#xff0c;但训练这些模型对我来说仍然是一个谜&#xff0c;这就是为什么我决定…

Java(七)(Lambda表达式,正则表达式,集合(Collection,Collection的遍历方式))

目录 Lambda表达式 省略写法(要看懂) 正则表达式 语法 案例 正则表达式的搜索替换和分割内容 集合进阶 集合体系结构 Collection Collection的遍历方式 迭代器 增强for循环 Lambda表达式遍历Collection List集合 ArrayList LinkedList 哈希值 HashSet底层原理 …

中东客户亲临广东育菁装备参观桌面型数控机床生产

近日&#xff0c;中东地区的一位重要客户在广东育菁装备有限公司的热情接待下&#xff0c;深入了解了该公司生产的桌面型数控机床。这次会面不仅加强了双方在业务领域的交流&#xff0c;也为中国与中东地区的经济合作描绘出更美好的前景。 在育菁装备公司各部门主要负责人及工作…

赋值,浅拷贝,深拷贝

1.前置知识 数据分为基本类型(String, Number, Boolean, Null, Undefined&#xff0c;Symbol)和引用类型(Object)基本类型&#xff1a;直接存储在栈内存中的数据引用类型&#xff1a;指向改数据的指针变量存储在栈内存中&#xff0c;真实的数据存储在堆内存中引用类型在栈内存…

cephadm部署ceph quincy版本,使用ceph-csi连接

环境说明 IP主机名角色 存储设备 192.168.2.100 master100 mon,mgr,osd,mds,rgw 大于5G的空设备192.168.2.101node101mon,mgr,osd,mds,rgw大于5G的空设备192.168.2.102node102mon,mgr,osd,mds,rgw大于5G的空设备 关闭防火墙 关闭并且禁用selinux 配置主机名/etc/hosts …

【UGUI】中Content Size Fitter)组件-使 UI 元素适应其内容的大小

官方文档&#xff1a;使 UI 元素适应其内容的大小 - Unity 手册 必备组件&#xff1a;Content Size Fitter 通常&#xff0c;在使用矩形变换定位 UI 元素时&#xff0c;应手动指定其位置和大小&#xff08;可选择性地包括使用父矩形变换进行拉伸的行为&#xff09;。 但是&a…

什么是 Node.js?

在 Node.js 出现之前&#xff0c;最常见的 JavaScript 运行时环境是浏览器&#xff0c;也叫做 JavaScript 的宿主环境。浏览器为 JavaScript 提供了 DOM API&#xff0c;能够让 JavaScript 操作浏览器环境&#xff08;JS 环境&#xff09;。 2009 年初 Node.js 出现了&#xf…

智能AI名片-Pushmall推贴SCRM数字名片的发展趋势

智能AI名片-Pushmall推贴SCRM数字名片的发展趋势 基于相识靠铺人脉相互引荐&#xff0c;共享人脉资源&#xff0c;众筹共创赋能交友、商务实现大众创业&#xff0c;灵活创收的智能AI名片平台。帮助企业实现成员管理与客户资源管理。功能说明 1、搜索查询&#xff1a;个人信息与…

1 时间序列模型入门: LSTM

0 前言 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一种用于处理序列数据的神经网络。相比一般的神经网络来说&#xff0c;他能够处理序列变化的数据。比如某个单词的意思会因为上文提到的内容不同而有不同的含义&#xff0c;RNN就能够很好…

lv11 嵌入式开发 C工程与寄存器封装 10

目录 1 C语言工程介绍 1.1 工程模板介绍 1.2 启动代码分析 2 C语言实现LED实验 2.1 C语言如何实现寄存器读写 2.2 实现LED实验 2.3 练习 1 C语言工程介绍 1.1 工程模板介绍 工程目录&#xff0c;后续代码都会利用到这个目录 interface.c 写了一个main函数的框架 int …

nginx反向代理解决跨域前端实践

需求实现 本地请求百度的一个搜索接口&#xff0c;用nginx代理解决跨域思路&#xff1a;前端和后端都用nginx代理到同一个地址8080&#xff0c;这样访问接口就不存在跨域限制 本地页面 查询一个百度搜索接口&#xff0c;运行在http://localhost:8035 index.js const path …

Stable-Diffusion——Windows部署教程

Windows 参考文章&#xff1a;从零开始&#xff0c;手把手教你本地部署Stable Diffusion Webui AI绘画(非最新版) 一键脚本安装 默认环境安装在项目路径的venv下 conda create -n df_env python3.10安装pytorch&#xff1a;&#xff08;正常用国内网就行&#xff09; python -…

【Unity实战】切换场景加载进度和如何在后台异步加载具有庞大世界的游戏场景,实现无缝衔接(附项目源码)

文章目录 最终效果前言一、绘制不同的场景二、切换场景加载进度1. 简单实现2. 优化 三、角色移动和跳跃控制四、添加虚拟摄像机五、触发器动态加载场景六、最终效果参考源码完结 最终效果 前言 观看本文后&#xff0c;我的希望你对unity场景管理有更好的理解&#xff0c;并且能…

Java抽象类和接口(1)

&#x1f435;本篇文章将对抽象类和接口相关知识进行讲解 一、抽象类 先来看下面的代码&#xff1a; class Shape {public void draw() {System.out.println("画");} } class Cycle extends Shape {public void draw() {System.out.println("圆形");} } …

飞翔的鸟小游戏

第一步是创建项目 项目名自拟 第二步创建个包名 来规范class 再创建一个包 来存储照片 如下&#xff1a; package game; import java.awt.*; import javax.swing.*; import javax.imageio.ImageIO;public class Bird {Image image;int x,y;int width,height;int size;doub…