前向渲染路径

news2024/9/17 7:35:46

1、前向渲染路径处理光照的方式

前向渲染路径中会将光源分为以下3种处理方式:

  • 逐像素处理(需要高等质量处理的光)
  • 逐顶点处理(需要中等质量处理的光)
  • 球谐函数(SH)处理(需要低等质量处理的光)

球谐函数处理光照的方式是将光照场景投影到球谐函数的空间中,通过一组球谐系数来表示光照。
内存换性能,细节表现效果差(不需要我们自己书写,Unity底层会帮助我们进行处理)

场景当中的各种光源将采用哪种方式处理?

在前向渲染中,一部分最亮的灯光以逐像素处理,然后4个点光源以逐顶点方式处理,其余的灯光以SH处理
一个光源是逐像素、逐顶点还是SH处理主要取决于以下几点:

  • 渲染模式设置为Not Important(不重要)的灯光始终以逐顶点或者SH的方式渲染
  • 渲染模式设置为Important(重要)的灯光始终是逐像素渲染
  • 最亮的平行光总是逐像素渲染
  • 如果逐像素光照的灯光数量少于项目质量设置中的Pixel Light Count(像素灯光计数)的数量,那么其余比较亮的灯光将会被逐像素渲染

注意:如果灯光渲染模式设置为Auto(自动),Unity会根据灯光的亮度以及与物体的距离自动判断重要性

 前向渲染路径处理光照的方式

Unity当中有一套划分光源“三六九等”的规则,主要通过 灯光渲染模式、项目质量设置中的像素灯光计数的数量、光照强度、距离物体距离来综合判定

在前向渲染路径中,会将光源分成所谓的逐像素、逐顶点、SH三种处理类型,有了对光源的“高中低”的身份认知,Unity底层就可以将这些光源的数据存储到Shader中对应的内置变量中,我们就可以通过这些内置变量获取到对应“身份”的光源数据,从而进行差异化的处理

2、前向渲染路径在哪里进行光照计算 

要进行光照计算,那肯定是在Shader当中的Pass渲染通道中进行计算。但是对于前向渲染来说,有两种Pass可以用来进行光照处理:
(1)Base Pass(基础渲染通道)
渲染物体的主要光照通道,用于处理主要的光照效果,主要用于计算逐像素的平行光以及所有逐顶点和SH光源
可实现的效果:漫反射、高光反射、自发光、阴影、光照纹理等
(2)Additional Pass(附加渲染通道)
渲染物体额外的光照通道,用于处理一些附加的光照效果,主要用于计算其他影响物体的逐像素光源,每个光源都会执行一次该Pass
可实现的效果:描边、轮廓、辉光等

对于一个前向渲染路径下的Unity Shader,通常会定义一个Base Pass(基础渲染通道)以及一个Additional Pass(附加渲染通道)
每次渲染时,一个Base Pass仅会执行一次(多个Base Pass情况除外)主要用于渲染环境光或自发光等
一个Additional Pass会根据影响该物体的其他逐像素光源的数量被多次调用,每个逐像素光源都会调用一次Additional Pass,由于开启了混合,渲染结果会和之前的光照颜色进行混合

注意:

  • Base Pass也可以有多个,比如需要双面渲染的情况
  • Base Pass默认支持阴影, Additional Pass默认不支持,可以通过添加#pragma multi_compile_fwdadd_fullshadows编译指令开启阴影
  • 这些Pass当中我们具体处理光照的方式是由我们自己决定的,使用逐顶点光照还是逐像素光照的计算方式,都根据我们的具体实现而定,前文提到的逐像素光源只是按照期望处理类型来分的而已

简而言之:
Base Pass(基础渲染通道):
主要用于处理影响该物体的一个高质量光源(如平行光)、所有中(逐顶点处理)低质量(SH处理)光源 等


Additional Pass(附加渲染通道):
主要用于处理影响该物体的除平行光以外的其它高质量光源(每个高质量光源都会调用)

3、前向渲染路径的内置光照变量和函数

常用内置光照变量

 常用内置光照函数


通过这些内置光照变量,我们便可以获取到前向渲染路径当中,对渲染质量有不同要求的光源们的相关数据。
只需要利用这些数据和函数在Base Pass(基础渲染通道)和 Additional Pass(附加渲染通道)中按照需求进行相关的逻辑处理即可

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

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

相关文章

线程的四种操作

所属专栏:Java学习 1. 线程的开启 start和run的区别: run:描述了线程要执行的任务,也可以称为线程的入口 start:调用系统函数,真正的在系统内核中创建线程(创建PCB,加入到链…

C++17: 用折叠表达式实现一个IsAllTrue函数

前言 让我们实现一个 IsAllTrue 函数,支持变长参数,可传入多个表达式,必须全部计算为true,该函数才返回true。 本文记录了逐步实现与优化该函数的思维链,用到了以下现代C新特性知识,适合对C进阶知识有一定…

2025最新:如何打造公司财务管理系统?Java SpringBoot实现,一步到位管理企业财务!

✍✍计算机毕业编程指导师** ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java…

STM32F407VET6开发板RT-Thread的移植适配

前言 最近购买了一块 STM32F407VET6开发板【魔女】,http://www.stm32er.com/ 通过原理图了解到,开发板板载 CMSIS-DAP 调试下载口,例程部分大部分以裸机程序为主 目标:打算移植适配到 RT-Thread 适配 RT-Thread RT-Thread 支持…

基于准静态自适应环型缓存器(QSARC)的taskBus万兆吞吐实现

文章目录 概要整体架构流程技术名词解释技术细节1. 数据结构2. 自适应计算队列大小3. 生产者拼接缓存4. 高效地通知消费者 小结1. 性能表现情况2. 主要改进3. 源码和发行版 概要 准静态自适应环形缓存器(Quasi-Static Adaptive Ring Cache)是taskBus用于…

【Python报错已解决】 No Python at ‘C:\Users...\Python Python39\python.exe’

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查Python安装路径2.2 …

苍穹外卖随记(一)

黑马苍穹外卖逻辑和细节的问题和解决 1.后端查询到员工的日期信息,将信息进行json化传给前端时发生:前端收到的是不标准的日期json串。 解决:1.注解进行json格式化(JsonFormat)2. 在spring MVC中,通过消息…

如何验证VMWare WorkStation的安装?

如何验证VMWare WorkStation的安装? 右击"网络",点击 打开"网络和Internet设置",点击更改适配器选项,如果出现VMNet1和VMNet8,则说明安装成功。

内网穿透(cpolar实现)

目录 一、介绍 二、内网穿透工具cpolar实现 1.下载与安装 2.cpolar指定authtoken 3.获取临时域名 4.验证临时域名有效性 一、介绍 内网穿透,即 NAT 穿透(Network Address Translation Traversal),是一种网络技术&#xff0…

Python爬虫使用实例-wallpaper

1/ 排雷避坑 &#x1f95d; 中文乱码问题 print(requests.get(urlurl,headersheaders).text)出现中文乱码 原因分析&#xff1a; <meta charset"gbk" />解决方法&#xff1a; 法一&#xff1a; response requests.get(urlurl,headersheaders) response.en…

java基础-IO(4)管道流 PipedOutputStream、PipedInputStream、PipedReader、PipedWriter

管道 提到管道&#xff0c;第一印象就是水管或者地下管道&#xff0c;一节接着一节&#xff0c;形如下图。 管道流 "流"从上一个管道 ——-> 下一个管道。又细分为字节流和字符流。 字节流&#xff08;PipedOutputStream、PipedInputStream&#xff09; 如果…

SSM框架介绍

SSM通常指的是三个开源框架的组合&#xff0c;即Spring、SpringMVC&#xff08;Spring Web MVC&#xff09;和MyBatis&#xff0c;这三个框架经常一起使用来开发Java企业级应用&#xff0c;特别是在Web应用开发中非常流行。 SSM框架介绍 Spring 简介&#xff1a;Spring是一个…

谷粒商城のNginx

文章目录 前言一、Nginx1、安装Nginx2、相关配置2.1、配置host2.2、配置Nginx2.3、配置网关 前言 本篇重点介绍项目中的Nginx配置。 一、Nginx 1、安装Nginx 首先需要在本地虚拟机执行&#xff1a; mkdir -p /mydata/nginx/html /mydata/nginx/logs /mydata/nginx/conf在项目…

ModuleNotFoundError: No module named ‘mmcv.transforms‘

不得已的解决方法&#xff1a; mmcv升级到2.0.0即可解决 升级后自然又面临一系列不兼容问题&#xff01; 官方文档查漏补缺

【STM32】呼吸灯实现

对应pwm概念可以去看我的博客51实现的呼吸灯 根据对应图我们可知预分频系数为999&#xff0c;重装载值为2000&#xff0c;因为设置内部时钟晶振频率为100MHZ &#xff0c;1s跳 100 000000次 &#xff0c;跳一次需要1/100 000000s 20ms0.02s 对应跳的次数为 我们使用通用定时器…

九,自定义转换器详细操作(附+详细源码解析)

九&#xff0c;自定义转换器详细操作&#xff08;附详细源码解析&#xff09; 文章目录 九&#xff0c;自定义转换器详细操作&#xff08;附详细源码解析&#xff09;1. 基本介绍2. 准备工作3. 自定义转换器操作4. 自定义转换器的注意事项和细节5. 总结&#xff1a;6. 最后&…

【前端学习】AntV G6-07 深入图形与图形分组、自定义节点、节点动画(上、中)

课程链接 AntV G6&#xff1a;深入图形与图形分组、自定义节点、节点动画&#xff08;上&#xff09;_哔哩哔哩_bilibili AntV G6&#xff1a;深入图形与图形分组、自定义节点、节点动画&#xff08;中&#xff09;_哔哩哔哩_bilibili 图形分组 Group | G6 (antgroup.com) 自…

ARM32开发——DMA内存到内存

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 需求数据交互流程开发流程依赖引入DMA初始DMA传输请求完整代码 关心的内容DMA初始化DMA初始化DMA数据传输请求完整代码 DMA中断开启…

封装智能指针 qt实现登录界面

1.封装独占智能指针——unique_ptr #include <iostream> #include <utility> // For std::move// 命名空间 namespace custom_memory { template <typename T> class myPtr { public:// 使用初始化列表进行初始化explicit myPtr(T* p nullptr) noexcept : …

卡西莫多的诗文集2022-2024.9月6-校庆国庆专版定版

通过网盘分享的文件&#xff1a;卡西莫多的诗文集2022-2024.9月6-A5-校庆国庆专版-定版.pdf 链接: https://pan.baidu.com/s/1cpFK5k1baGXbSGxY30GL_A?pwdjgnt 提取码: jgnt 卡西莫多的诗文集2022-2024.9月6-校庆国庆专版&#xff0c;又稍作修改并勘误了一些错字&#xff0c;…