Chapter18 基于物理的渲染——Shader入门精要学习

news2024/11/15 12:20:18

Chapter18 基于物理的渲染

  • 一、PBS理论和数学基础
    • 1.光是什么
      • 微表面模型
    • 2.渲染方程
    • 3.精确光源
    • 4.双向反射分布函数 BRDF
    • 5.漫反射项
      • (Lambert 模型)Lambertian BRDF为:
      • Disney BRDF中漫反射项
    • 6.高光反射项
      • 微面元理论
      • BRDF的高光反射项
        • ①菲涅尔反射函数
        • ②法线分布函数
        • ③阴影-遮挡函数
    • 7.PBS中的光照
    • 8.Unity中PBS实现
  • 二、Unity的Standard Shader
    • 1.如何实现
    • 2.如何使用
  • 三、复杂例子
    • 1.设置环境光照
    • 2.设置反射探针
    • 3.设置材质
    • 4.设置线性空间

一、PBS理论和数学基础

1.光是什么

光是一种电磁波,由光源射出,与场景中的物体相交,一部分被吸收,一部分被散射,最后被感应器(眼睛等)吸收成像。光的传播方向会受到介质折射率的影响,折射率突变会导致散射现象。
我们一般假设两个介质的边界是无限大并且光滑的。用菲涅尔等式来描述光的反射与折射的各自占比
在这里插入图片描述

微表面模型

  • 微表面模型:真实物体表面由许多微小的凹凸不平的表面组成,这些表面称为微表面,微表面模型假设每个微表面都是光学平滑的
  • 光滑表面反射光线方向变化小,高光反射清晰;粗糙表面反射光线方向变化大,高光反射模糊
    在这里插入图片描述
  • 金属材质所有被折射的光会被吸收,转化为其他能量;非金属材质一部分会吸收,一部分又会散射到外部,散射出去的光叫做 次表面散射光(subsurface-scattered light)
    在这里插入图片描述
  • 次表面散射距离:次表面散射光从内部射出的位置与入射点之间的距离称为次表面散射距离
    在这里插入图片描述
    由于像素大小有限,如果次表面散射距离小于像素大小,可以忽略次表面散射光的影响,在局部范围内进行渲染;如果次表面散射距离大于像素大小,则需要使用特殊的渲染技术来模拟次表面散射效果——次表面散射渲染技术

2.渲染方程

  • 辐射率 radiance:单位面积、单位方向上光源的辐射通量,用L来表示,被认为是单一光线的亮度和颜色评估
  • 着色(shading)过程:通常使用入射光线的 L i L_{i} Li 来计算出射光线 L o L_{o} Lo
  • 渲染方程:给定观察视角v,该方向上的出射辐射率 L o L_{o} Lo = 该点向观察方向发出的自发光辐射率 L e L_{e} Le + 所有有效入射光 L i ( ω i ) L_{i}(\omega_{i}) Li(ωi) 到达观察点的辐射率积分和
    在这里插入图片描述
    在实时渲染中,自发光项通常是直接加上某个自发光值,累加部分也基本无法实现,因此积分部分基本会被若干精确光源的叠加所替代,而不需要计算所有入射光线在半球面上的积分

3.精确光源

在实时渲染中,会用 精确光源 来近似模拟面光源 —— 点光源、平行光、聚光灯等。用 l c l_{c} lc 来表示方向,使用 c l i g h t c_{light} clight 来表示颜色,使用下面等式来计算在某个观察方向v上的出射辐射率:
在这里插入图片描述
若场景中包含多个点光源,把它们结果相加即可
在这里插入图片描述

  • f ( l c , v ) f(l_{c},v) f(lc,v) :当给定入射光方向后,有多少百分比的光照被反射到了观察方向上——双向反射分布函数

4.双向反射分布函数 BRDF

  • 两种理解 f ( l , v ) f(l,v) f(l,v)

    • 给定入射角度 l 后,BRDF可以给出所有出射方向上的反射和散射光线的相对分布情况
    • 给定出射角度 v 后,BRDF可以给出所有入射方向到该出射方向的光线分布
    • (更直白)当一束光沿着入射方向 l 到达表面某点时, f ( l , v ) f(l,v) f(l,v) 表示有多少能量被反射到了观察方向上
  • BRDF是基于物理的:满足交换律能量守恒

    • 交换律:交换 l 和 v 后不变 f ( l , v ) = f ( v , l ) f(l,v) = f(v,l) f(l,v)=f(v,l)
    • 能量守恒:表面反射能量不能超过入射能量 ∫ Ω f ( l , v ) ( n ⋅ l ) d ω o ≤ 1 \int_{Ω}{}f(l,v)(n·l)d\omega_{o} ≤ 1 Ωf(l,v)(nl)dωo1

BRDF可以用于描述两种物理现象:表面反射(高光反射项)和次表面散射(漫反射项)
在这里插入图片描述

5.漫反射项

(Lambert 模型)Lambertian BRDF为:

c d i f f c_{diff} cdiff: 表示漫反射光线所占比例——漫反射颜色;
除以 π \pi π :假设漫反射在所有方向上的强度都是相同的,而BRDF要求半球内的积分值为1。
在这里插入图片描述
给定入射方向 l 的光源在表面某点的出射漫反射辐射率值为:
在这里插入图片描述

Disney BRDF中漫反射项

在这里插入图片描述

  • baseColor 是表面颜色,通常由表面纹理采样得到
  • roughness 是表面粗糙度。
  • 使用了 Schlick 菲涅尔近似等式来模拟在掠射角的反射变化,同时使用了表面粗糙度来改变 —— 使得光滑材质在掠射角具有更为明显的阴影边,又使得粗糙材质在掠射角具有亮边

6.高光反射项

微面元理论

计算BRDF时,入射方向 l 和 出射方向 v 都会被给定,只有一部分微面元反射的光线会进入我们眼睛中,即它们的法线 m 等于 l 和 v 的一半,即半程向量 h;这些微面元反射也不一定会全部被添加到BRDF中,因为可能出现其他面元遮挡的情况

BRDF的高光反射项

在这里插入图片描述
在这里插入图片描述

  • D ( h ) D(h) D(h):微面元的法线分布函数 NDF——计算有多少比例的微面元法线满足 m = h
  • G ( l , v , h ) G(l,v,h) G(l,v,h):阴影-遮掩函数——计算满足 m = h 的微面元中有多少不会被遮挡(活跃微面元的所占浓度)
  • F ( l , h ) F(l,h) F(l,h):菲涅尔反射——反射光线占入射光线的比率
  • 分母 4 ( n ⋅ l ) ( n ⋅ v ) 4(n·l)(n·v) 4(nl)(nv):于校正从微面元的局部空间到整体宏观表面数量差异的校正因子
①菲涅尔反射函数

描述了当光照方向和观察方向夹角逐渐增大时高光反射强度增大的现象

  • Schlick 菲涅尔近似等式
    在这里插入图片描述
  • c s p e c c_{spec} cspec 是材质的高光反射颜色
②法线分布函数

值是非负的标量,决定了高光区域的大小、亮度和形状

  • Blinn-Phong 模型:(归一化的Phong法线分布函数)
    • g l o s s gloss gloss 是表面粗糙度相关参数
    • 是一种经验模型,不能真实反映真实世界
      在这里插入图片描述
  • GGX分布(Trowbridge-Reitz法线分布函数)
    • α \alpha α是表面粗糙度参数
    • 具有更明亮、更狭窄且拖尾更长的高光区域
      在这里插入图片描述
  • GTR分布(Generalized-Trowbridge-Reitz法线分布函数),把分母指数的2变为可调参数
  • Disney 还发现让 α = r o u g h n e s s 2 \alpha = roughness^{2} α=roughness2可以在粗糙度上得到更加线性的变化
③阴影-遮挡函数

G ( l , v , h ) G(l,v,h) G(l,v,h) 也被称为几何函数,具有给定面法线 m 的微面元在沿着入射方向 l 和观察方向 v 上不会被其他微面元挡住的概率,是一个0~1的概率值
习惯把 G ( l , v , h ) G(l, v, h) G(l,v,h) 和高光反射项的分母 ( n ⋅ l ) ( n ⋅ v ) (n ⋅ l)(n ⋅ v) (nl)(nv) 部分结合起来,即把 G ( l , v , h ) / ( n ⋅ l ) ( n ⋅ v ) G(l, v, h)/(n ⋅ l)(n ⋅ v) G(l,v,h)/(nl)(nv) 的部分合在一起讨论,称这个合项为可见性项(visibility term)

  • Smith 模型(为GGX设计的)
    • θ v \theta_{v} θv 表示观察方向 v 和表面法线 n 之间的夹角
      在这里插入图片描述
  • Smith-Joint 模型
    Λ(ωo)Λ(ωi) 分别评估出射方向和入射方向上的阴影和遮掩,基于这种分开计算的 Λ(ωo) 和 Λ(ωi)的 Smith 模型在这里插入图片描述

7.PBS中的光照

随着新的技术不断被提出,实时面光源也不再是一个奢侈的梦想

  • 基于图像的光照(imag-based lighting,IBL)
    • 是把场景中远处的光照存储在类似环境贴图的图像中
    • 环境贴图可以表示光滑物体表面反射的环境光
    • 在 Unity 中,这种光照通常是由反射探针(Reflection Probes)机制来实现的,我们可以在 Shader中获取当前物体所在的反射探针并在需要时对它们的采样结果进行混合

8.Unity中PBS实现

基于GGX模型,与Disney BRDF中的漫反射项相同

  • 漫反射项:
    在这里插入图片描述
  • 高光项:
    • 菲涅尔反射函数
      在这里插入图片描述
    • 法线分布函数
      在这里插入图片描述
    • 阴影-遮掩函数(Smith-Joint 模型)
      Λ(ωo)Λ(ωi) 分别评估出射方向和入射方向上的阴影和遮掩,基于这种分开计算的 Λ(ωo) 和 Λ(ωi)的 Smith 模型在这里插入图片描述

二、Unity的Standard Shader

Unity创建模型或者材质时,默认着色器都是一个名为Standard 的着色器——基于物理的渲染

  • Unity支持的两个工作流:金属工作流(metallic workfollow)和高光反射工作流(specular workflow)
    • 金属工作流:定义了材质表面的金属值(是金属类型的还是非金属类型的)
    • 高光反射工作流:可以直接指定表面的高光反射颜色(有很强的高光反射还是很弱的高光反射)等

1.如何实现

Standard.shader 和 StandardSpecular.shader

  • SubShader:都定义了两个SubShader
    • 第一个定义了前向渲染路径和延迟渲染路径的Pass,以及用于投射阴影和提取元数据的Pass
    • 第二个定义了四个Pass,两个用于前向渲染路径,一个用于提取投射阴影,另一个用于提取元数据(相比于第一个取消了一些计算——视差贴图、不计算软阴影等)
  • 两个shader最大的区别在于设置BRDF的输入时,使用了不同的函数来设置各个参数—— MetallicSetup 和 SpecularSetup

2.如何使用

  • 需要在 Edit →Project Setttings→Player→Other Settings→Color Space 中选择Linear 才可以,这是因为基于物理的渲染需要使用线性空间

三、复杂例子

在这里插入图片描述

1.设置环境光照

  • 使用 HDR 格式的 Skybox 可以让场景中物体的反射更加真实,有利于我们得到更加可信的光照效果
  • 实时全局光照 GI 系统,场景中的物体可以接受直接光照和间接光照的影响
    • 直接光照:需要保证平行光的方向和 Skybox 中的太阳或其他光源的位置一致,使得物体产生的光照信息可以与 Skybox 互相吻合
    • Mode 设置:
      • Realtime 模式进行实时的光照计算;
      • Baked模式烘焙到一张光照纹理(lightmap)中,物体移动时阴影等光照效果不改变;
      • Mix模式混合使用实时模式和烘焙模式,它会把场景中的静态物体(即那些被标识为 Static 的物体)的光照烘焙到光照纹理中,但仍然会对动态物体产生实时光照
    • 间接光照:Indirect multiplier可以调整间接光强度

2.设置反射探针

  • 在实时渲染中,我们经常使用Cubemap来模拟反射效果,但是当物体移动时,就容易穿帮——可以使用反射探针
  • 反射探针的工作原理:它允许我们在场景中的特定位置上对整个场景的环境反射进行采样,并把采样结果存储在每个探针上
  • 探针有三种类型:
    • Baked:提前烘焙,只会处理那些静态物体(标识为 Reflection Probe Static)
    • Realtime:实时更新当前的 Cubemap,并且不受静态物体还是动态物体的影响
    • Custom:既可以让我们从编辑器中烘焙它,也可以让我们使用一个自定义的 Cubemap 来作为反射映射,但自定义的 Cubemap 不会被实时更新
  • 反射探针应该被放置在那些具有明显反射现象的物体的旁边,或是一些墙角等容易发生遮挡的物体周围
  • 反射探针还可以模拟互相反射

3.设置材质

真实可信的渲染效果,我们需要为场景中的物体指定合适的材质

4.设置线性空间

线性空间可以得到更加真实的效果

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

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

相关文章

LabVIEW和IQ测试仪进行WiFi测试

介绍一个使用LabVIEW和LitePoint IQxel-MW IQ测试仪进行WiFi测试的系统。包括具体的硬件型号、如何实现通讯、开发中需要注意的事项以及实现的功能。 使用的硬件​ IQ测试仪型号: LitePoint IQxel-MW 电脑: 配置高效的台式机或笔记本电脑 路由器: 支持802.11ax (Wi-Fi 6) 的…

便携气象站:科技助力气象观测

在科技飞速发展的今天,便携气象站以其轻便、高效、全面的特点,正逐渐改变着气象观测的传统模式。这款小巧而强大的设备,不仅为气象学研究和气象灾害预警提供了有力支持,更为户外活动、农业生产等领域带来了诸多便利。 便携气象站是…

遗传算法模型Python代码——用Python实现遗传算法案例

一、遗传算法概述 1.1适用范围 遗传算法(Genetic Algorithm, GA)是一种启发式搜索算法,广泛应用于以下领域: 优化问题:如函数优化、路径规划、资源分配等。机器学习:用于特征选择、超参数优化等。经济与…

服务器系统盘存储不够,添加数据盘并挂载(阿里云)

目录 1.获取数据盘设备名称 2.为数据盘创建分区 3.为分区创建文件系统 4.配置开机自动挂载分区 阿里云数据盘挂载说明链接:在Linux系统中初始化小于等于2 TiB的数据盘_云服务器 ECS(ECS)-阿里云帮助中心 1.获取数据盘设备名称 sudo fdisk -lu 运行结果如下所示…

解决 elementUI 组件在 WebStorm 中显示为未知标签的问题

解决 elementUI 组件在 WebStorm 中显示为未知标签的问题 一、问题 自从转到 ts 之后,编辑器就一直提示用到的 elementUI 标签未知,一直显示一溜黄色警示,很烦: 二、解决 把它改成大写就可以了。 如下: 把整个项目…

【C++】学习笔记——哈希_2

文章目录 十八、哈希3. 实现哈希表哈希表的存储节点哈希函数哈希表的定义哈希表的插入哈希表的查找哈希表的删除测试函数完整代码结果 未完待续 十八、哈希 3. 实现哈希表 哈希表的实现方法有蛮多种,这里我们选一个比较经典的开散列法来实现哈希表。由于STL库里的…

使用PicGo操作gitee图床(及web端html不能访问图片的解决办法)

1.新建仓库 2.输入仓库名称,也就是图床名称,必须设置开源可见 也可以在创建仓库后,点击管理->基本信息->是否开源进行设置 鼠标悬浮到右上角头像->设置 点击私人令牌 点击生成新令牌,填写描述,直接点提交即可 点击提交后输入登录密码会生成一个token秘钥,如下,这个…

新版本异次元荔枝V4自动发卡系统源码

新版本异次元荔枝V4自动发卡系统源码,增加主站货源系统,支持分站自定义支付接口,目前插件大部分免费,UI页面全面更新,分站可支持对接其他分站产品,分站客服可自定义,支持限定优惠。 源码下载&a…

matlab--legend利用for循环添加图例

第一种方法 %% 第一种方法 R 1:4; THETA1 atand(R./1.8); legend_name {}; for i 1:4THETA atand(R(i)./1.8);intTheta floor(THETA);R_THERA 1.8 - (R(i)./tand(intTheta-10:intTheta10));R_THERA1 1.8 - (R(i)/tand(intTheta));plot(R_THERA);grid on;hold onlegend…

Git之repo sync -c与repo sync -dc用法区别(四十八)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

了解Linux中的shell脚本

目录 1、什么是shell 2、编写第一个shell文件 3、shell的权限 4、变量 5、 shell传递参数 6、shell数组 7、shell基本运算符 7.1 算术运算符 7.2 关系运算符 7.3 布尔运算符 7.4 逻辑运算符 7.5 字符串运算符 8、控制语句 8.1 if 8.2 for 8.3 while语句 9、其他 1、…

C++~~string模拟实现(3)

目录 1.传统写法和现代写法 2.对于流提取的优化 3.简单机制了解 4.string类的几个构造函数总结 4.1基本用法 4.2两个赋值方式 4.3拷贝构造 4.4获取字符 4.5一个容易混淆的对比 4.6创建对象 1.传统写法和现代写法 (1)上面的代码里面的左边部分是…

排序---归并排序

归并排序 一、定义二、实现原理三、代码实现 一、定义 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有…

ES中聚合查询之date_histogram查询出现key_as_string 和 key含义

ES中聚合查询之date_histogram查询出现key_as_string 和 key含义 DSL语句 #实例 GET /capture_features_202407/_search {"query": {"bool": {"must": [{"terms": {"plateNo": ["汉A00001"]}},{"range&quo…

【C++】——初识模版

文章目录 前言函数模版函数模版的原理函数模版的实例化 类模版类模版的实例化 前言 当我们使用一个通用的函数: //为每一个类型都编写一个重载版本 void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& …

Java实现七大排序(一)

目录 一.插入排序 1.直接插入排序 2.希尔排序 二.选择排序 1.选择排序 2.堆排序 三.总结 一.插入排序 1.直接插入排序 直接插入排序的原理与线下玩扑克牌类似。我们拿到一张牌后要排序,方法就是一张一张对。直接插入排序也是这样的,我们得到一张…

融云 2024 ChinaJoy | 你有一个必逛的展位 @W4 馆 B786

惊喜闪现👇 打开抖音搜索【融云】 关注融云官抖,可到展位领取好礼一份 更有惊喜内容不定时掉落~

【CTFWP】ctfshow-web32

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 题目介绍&#xff1a;题目分析&#xff1a;payload&#xff1a;payload解释&#xff1a;flag 题目介绍&#xff1a; <?php/* # -*- coding: utf-8 -*- # Autho…

昇思25天学习打卡营第23天|ShuffleNet图像分类

ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一样主要应用在移动端&#xff0c;所以模型的设计目标就是利用有限的计算资源来达到最好的模型精度。ShuffleNetV1的设计核心是引入了两种操作&#xff1a;Pointw…

誉天Cloud Service Solutions Architect(云服务)怎么样

誉天云服务课程亮点 深度融合云原生 包含原生K8s和docker内容&#xff0c;引入isito和ASM功能进行微服务治理&#xff0c;结合Linux功底设计云上性能优化&#xff0c;和架构设计。师资力量强大 课程由两名5HCIE认证讲师授课&#xff0c;认证辅导由已通过HCIE-Cloud Service专职…