Unity Shader 学习20:URP LitForwardPass PBR 解析

一、PBR的整体流程

从项目的Lit.shader文件进入,可以看到第一个pass即为前向渲染,其中片元着色器中使用到的 UniversalFragmentPBR 函数即为本文主要解析的对象。

UniversalFragmentPBR 函数主要分为 3 个阶段:++数据准备++、++光照计算++、++最终颜色叠加++。


1. 数据准备

主要涉及了一些数据的初始化,如 brdfData、clearCoat、shadowMask、ao系数、meshRenderingLayers、MainLight。

2. 数据计算

数据计算分为++间接光++与++直接光++两个环节,间接光使用GI进行计算,直接光为PB计算。

(1)间接光 - GlobalIllumination()
  • 漫反射:主要由在inputData初始化阶段通过 采样环境LightMap 或 SH 得到的 bakedGI提供。
  • 镜面反射:使用IBL算法计算。

两个类型的 radiance 计算完毕后,会送进 EnvironmentBRDF() ++乘上各自的brdf,相加得到最终的结果++。

(2)直接光 - LightingPhysicallyBased()

直接光的漫反射和镜面反射是一样的算法,radiance部分都等于++L * ( n ·l) = lightColor * lightAttenuation * NdotL++,算完之后++同理乘上各自的brdf,相加得到最终的结果++ 。不过因为两者的radiance值一样,可以合并同类项,简化公式为++radiance * ( diffuse的brdf + specular的brdf )++。

3. 最终颜色叠加


二、BRDF 解释

现在代码差不多理解完了,但是一直没有解释 什么是brdf。

BRDF(bidirectional reflectance distribution function):双向反射分布函数 ,用于计算 反射比例 。只要我们知道 光向量 & 视角向量,就能得出眼睛能看到的光线强度。

要理解brdf的公式,就需要先理解微表面的概念,真实世界中看着再光滑的表面放大后也会存在凹凸不平的微表面,因此所有入射光不可能完整地、或者如宏观法线那样准确方向地 再从该点射出,而brdf就是用来描述这个过程中的损耗或偏差的。

1.漫反射

漫反射的brdf等于 albedo/Π。

2. 镜面反射

F(Fresnel) :菲涅尔项,考虑了++高光的反射比例并不是一个常量++,会随着光线与表面的角度发生变化;

G (Geometry):几何遮蔽项,考虑了微表面间的++自遮挡与互相遮挡++;

D(Distribution):法线分布函数,考虑了微表面法线在宏观法线的分布密度,也就是真++正在方向上允许反射进肉眼方向++的微表面占整个表面的比例。

后面的那个公式是将图片中框住的那个部分整体作为一个 V 可见性项 来简化表示。

相关推荐
落羽凉笙7 小时前
Python学习笔记(3)|数据类型、变量与运算符:夯实基础,从入门到避坑(附图解+代码)
笔记·python·学习
Quintus五等升7 小时前
深度学习①|线性回归的实现
人工智能·python·深度学习·学习·机器学习·回归·线性回归
一个笔记本8 小时前
godot log | 修改main scene
游戏引擎·godot
jz_ddk8 小时前
[学习] 卫星导航的码相位与载波相位计算
学习·算法·gps·gnss·北斗
华清远见成都中心9 小时前
人工智能要学习的课程有哪些?
人工智能·学习
hssfscv10 小时前
Javaweb学习笔记——后端实战2_部门管理
java·笔记·学习
白帽子黑客罗哥10 小时前
不同就业方向(如AI、网络安全、前端开发)的具体学习路径和技能要求是什么?
人工智能·学习·web安全
nnsix10 小时前
Unity PicoVR开发 实时预览Unity场景 在Pico设备中(串流)
unity·游戏引擎
于越海11 小时前
材料电子理论核心四个基本模型的python编程学习
开发语言·笔记·python·学习·学习方法
我命由我1234511 小时前
开发中的英语积累 P26:Recursive、Parser、Pair、Matrix、Inset、Appropriate
经验分享·笔记·学习·职场和发展·求职招聘·职场发展·学习方法