当前位置: 首页 > news >正文

前向渲染路径

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(附加渲染通道)中按照需求进行相关的逻辑处理即可

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • js 查找数组对象中id相同的元素,把他们放到新数组对象中
  • 【系统架构设计师】管道-过滤器架构
  • 【Redis】Redis 主从复制原理与配置详解:解决单点故障与性能瓶颈的最佳方案
  • c++的初始化列表与const成员
  • python(进阶2)实现自动化注册和登录
  • 漫谈设计模式 [17]:状态模式
  • ✨机器学习笔记(二)—— 线性回归、代价函数、梯度下降
  • Windows本地制作nginx证书
  • python中的循环结构
  • MonoHuman: Animatable Human Neural Field from Monocular Video 精读
  • 树莓派5_opencv笔记27:Opencv录制视频(无声音)
  • 使用Spring Boot集成Spring Data JPA和单例模式构建库存管理系统
  • v0.dev快速开发
  • 两数之和--力扣1
  • JS手写实现深拷贝
  • SegmentFault for Android 3.0 发布
  • [译] 怎样写一个基础的编译器
  • 11111111
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Apache的基本使用
  • FineReport中如何实现自动滚屏效果
  • Java 最常见的 200+ 面试题:面试必备
  • JavaScript标准库系列——Math对象和Date对象(二)
  • jQuery(一)
  • mysql 5.6 原生Online DDL解析
  • ReactNativeweexDeviceOne对比
  • SegmentFault 2015 Top Rank
  • SOFAMosn配置模型
  • SQLServer之创建显式事务
  • uni-app项目数字滚动
  • 计算机在识别图像时“看到”了什么?
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 入门到放弃node系列之Hello Word篇
  • 入门级的git使用指北
  • 思考 CSS 架构
  • 探索 JS 中的模块化
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • #Linux(帮助手册)
  • #pragma pack(1)
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (1)常见O(n^2)排序算法解析
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (LLM) 很笨
  • (solr系列:一)使用tomcat部署solr服务
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (二)JAVA使用POI操作excel
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (回溯) LeetCode 46. 全排列
  • (六)c52学习之旅-独立按键