【技术美术图形部分】PBR直接光部分:Disney原则的BRDF和次表面散射模型

写在前面

补充去年遗漏下的知识。很多叙述都是参考了众多大佬的文章!因为是作为个人学习总结的博客,所以直接卑微的借鉴过来了,后面会给出所有参考的文章。

另外,放上一个忘了在哪一篇知乎评论里的截图:

说的蛮好。

1 PBR

叙述参考PBR(物理渲染技术)在实时渲染中的概念与限制

PBR,即Physically Based Rendering,基于物理的渲染。指的是一个总的过程:基于物理参数的美术流程和渲染流程。基于物理的灯光和相机这篇文章总结的好好,与传统的技术相比,PBR有真实的测量值作为标准,排除了主观审美带来的不确定性,制作出的效果更统一、准确。

正因此,PBR绝不止是简单的Shader,它主要包括以下三个部分:

  • 基于物理的材质Material
  • 基于物理的光照Light
  • 基于物理适配的相机Camera 

三部分互不影响,但都必须保证准确。传统的着色思路是在特定光照下调整材质,光照变了效果就变了,比较之下PBR才能实现一种材质在不同光照环境下呈现的效果都是正确的。

1.1 基于物理的光照 Lighting

基于物理的光照,就是:全局光照。

光源表述:辐射强度

我们之所以能看物体,是因为光源发射光线,照亮了物体。那既然是基于物理的光照,就需要严格用辐照度来量化光了,具体可以跟着101闫神过一遍辐射度量学的内容。

光线传输方式

确定光源表述后,还需要确定渲染采用什么算法考虑光线传输:是直接上光追模拟出真实的光线传播过程,还是只采用模拟直接光照的光栅化+其他全局光照的算法?

光线传输方式往往是渲染引擎内置,例如离线渲染的路径追踪、实时渲染的光栅化+其他全局光照算法,已有稳定成熟的算法,一般讨论PBR的时候重点会放在第3个材质部分。

1.2 基于物理的相机 Camera

【技术美术百人计划】图形 5.1.2 基于物理的相机概述

 主要涉及曝光三角形、快门速度、光圈、感光度、相机和引擎。

1.3 基于物理的材质 Material

平时讲材质的时候其实就是在讲光照模型(Illumination Model),因为材质决定了物体表面与光线相交时的如何进行光学交互,光学交互又决定着着色思路和算法

(补充一点,某着色点在屏幕上的最终颜色 = 光源颜色 * 材质颜色 * 反射系数 * 规定的函数。)

2 光照模型

2.1 发展历程

简单总结一下参考文章种列举的光照模型研究的发展历程: (参考自什么是光照模型

1970 Lambert -- > 1975 Phong、Blinn-Phong --> 1980 Whitted光线追踪 --> 1982 Cook-Torrance模型 --> 1986 Kajiya-路径追踪

2.2 分类1:基于物理/经验

基于物理

PBR(基于物理的BRDF)

基于经验

通过经验总结出一套模拟光照的模型,就是那4个传统光照(基于经验的BRDF)

2.3 分类2:局部光照/全局光照

局部光照模型

local的,仅考虑直接光照的光照模型。光栅化就是基于局部光照模型进行的,例如4个熟知的经典光照模型,由于只考虑直接光照来计算交点处的光强,能计算的仅仅是漫反射高光反射自发光环境光

基于BRDF的微表面模型也是局部光照模型。

全局光照模型

Global,描述光的真实传播。基于渲染方程(由BRDF反射方程进一步得到的渲染方程)的光线追踪、路径追踪等等都算作全局光照模型。

2.4 4种经验光照模型

分别是,

  • Lambert
  • 半Lambert([0,1]-->[0.5,1],提升了漫反射亮度)
  • Phong(增加了镜面反射)
  • Blinn-Phong(用半角向量以优化了高光)

快速复习通道:【Unity Shader】实现基础光照模型

2.5 经典光照模型与PBR对比

理论基础经典光照模型PBR
漫反射Lambert

Lambert

经典光照模型中,

漫反射——Lambert

镜面反射——Blinn-Phong

环境光——

3 BRDF

BRDF,即双向反射分布函数,注意这里的“反射”,意味着

3.1 Cook-Torrance模型

着色模型与PBR原理综述叙述PBS历史的时候,开头就从Cook和Torrance提出的光反射模型——Cook-Torrance模型开始介绍。这其实是微表面材质模型的知识范畴,在6月份左右GAMES101作业7提高-实现微表面模型你需要了解的知识就有涉及到,Cook-Torrance增加了D、F、G三项信息去刻画细节,提升了渲染的真实感:

3.2 讨论BRDF和光线追踪

BRDF是一种场景中光线与物体表面交点的光强度的计算方法,而光线追踪是上述基于物理的光线传播方式的算法,这意味着BRDF即使不用光追算法就能实现。

如果不用光追,BRDF即使是叠了“基于物理”“考虑了次表面散射”双重buff,它还是只能计算直接光照的局部光照模型。

4 Disney原则的BRDF

该部分学习主要参考了:【基于物理的渲染(PBR)白皮书】(三)迪士尼原则的BRDF与BSDF相关总结

基于对现实材料的考察,Disney的BRDF简化了复杂的PBR参数和制作流程,给出了一套基于少量简单易懂的参数和高度完善的美术工作流程,成为了后续游戏和影视行业遵循的PBR方向和标准,也是次世代(后续有介绍“次世代”概念)高品质渲染技术的代名词。

BRDF之后又提出了BSDF,时间线大概是2012年推出Disney Principled BRDF,2015年提出Disney BSDF。

4.1 Disney采用的材质分析

MERL 100 BRDF材质库

BRDF Explorer

BRDF Image Slice切片

点到为止,具体可以直接看参考文章的第二部分总结。

4.2 10个标量参数

迪士尼原则的BRDF核心理念在于:使用直观参数,参数尽可能少,范围在[0,1]等,总之是一种非金属和金属材质的混合模型,用参数金属度metallic在金属和非金属BRDF之间进行线性插值,这个方法不是那么的“物理”,但“美术友好”。

至于都有哪些参数,我选择直接截图的方式展示出来,之后复习也会更加方便(图源):

4.3 Disney原则的Specular

主要是微平面理论的内容,我在GAMES101作业7提高-实现微表面模型你需要了解的知识这一篇文章对于以下关键的三项都过讨论:

  • 法线分布项D
  • 阴影遮挡项G
  • 菲涅尔项F

本篇文章主要补充的是下一节计算Diffuse项的方法,以及次表面模型的细节。 

4.4 Disney原则的Diffuse

关于Lambert模型

实时渲染中最常采用的是Lambert来模拟漫反射:

Disney原则的BRDF也采用了Cook Torrance BRDF模型,但对于漫反射计算有自己的看法。

Diffuse项的特点

Disney通过分析MERL 100 BRDF材质,发现真实材质的diffuse项有这两种特点:

  • diffuse会有类似于specular的光斑
  • 部分材质的diffuse会在掠射角有明显的光环——掠射逆反射(会在5.4小节细说)

以上提到的两个特点都是简单的Lambert模型所无法实现的,为了解决这一问题Disney选择了更加复杂的、具有方向性的(non-Lambertian)漫反射计算方法——Schlick菲涅尔近似等式+掠射逆反射,先放上Disney的漫反射公式(公式我就直接截图的参考文章里的了~):

这个公式耦合了两个因素,

  • Schlick菲涅尔近似
  • 掠射逆反射

之前在用Cubemap实现天空盒和环境映射中实现菲涅尔反射时就用这个近似来计算了,下一小节的重点会放在掠射逆反射相关的次表面散射。

5 次表面散射 SSS

次表面散射,即Subsurface Scattering, SSS,是一种从微观尺度对物体表面漫反射光的解构,某一篇参考文章中说的非常好:“次表面散射之于漫反射,就像H2O之于水,只有研究水的分子结构才会说H2O,日常都会说水而非H2O”,所以对于日常使用来讲,漫反射更多想到粗糙的Lambert漫反射模型,而深究下去漫反射其实是次表面散射。

5.1 漫反射的实质

用Lambert模型计算diffuse分量,出射光线方向和入射光线的方向是无关的。

但严格来讲,漫反射是次表面散射——光线折射进物体表面多次反射再折射出来,它并不是一种光学现象,反射/折射的方向也会随着入射角度的改变而改变。

5.2 与微表面模型的关系

微表面模型的假设

4.3小节中的Specular项计算就是基于微表面理论的了,微表面模型做了以下假设:

  1. 微表面的尺寸小于着色区域大于可见光波长:物体表面从远处看是外观(diffuse、glossy),近处看是一个个微小的、平的几何面
  2. 这些平坦的几何面都符合几何光学定律:可以看成是一个个非常小的镜子
  3. 光线只在微表面之间弹射一次(single-bounce):一次之后弹射的光线不改变着色结果,也就是离开表面的点就是进入表面的点 

glossy和diffuse材质

注意这里的材质表现是基于法线分布的混乱程度,因此glossy在微观上看仍然是specular。而diffuse仅仅是法线分布混乱,真正计算时,由于假设中只考虑光线弹射一次,diffuse计算还是会按照Lambert模型来考虑。

多次弹射:次表面散射

以上假设3中,当考虑多次弹射情况时,就是这一小节所讲的次表面散射了。 

5.3 光滑的次表面散射模型

微表面的不规则程度小于次表面散射距离,如下图:

由于散射距离实在太大了,发生逆反射几率很小很小(后面有补充解释),整个表面可以被认为是平坦的,此时次表面散射已经不是局部而言了,要整体一起建模计算,微表面理论也就用不上了。

考虑菲涅尔效应

这种情况下,能影响次表面散射的只有表面反射(高光项Specular)与次表面反射(漫反射项Diffuse)之间的能量平衡关系。

菲涅尔效应告诉我们:随着掠射角度的增加,漫反射随着高光的反射的增加而减小。所以我们需要去除specular拿走的部分,因此光滑次表面这类模型通常会乘上1-菲涅尔项。也就是在原有的Lambert漫反射基础上叠加上1-菲涅尔项。具体参考【渲染】Disney BSDF 深度解析

公式中的具体体现

5.4 粗糙的次表面散射模型

当微表面不规则程度大于次表面散射距离,如下图:

此时次表面散射就要针对每个微小表面局部计算了,涉及到微分几何相关的效应(逆反射),因此计算漫反射时需要基于微表面理论,每个微表面局部发生次表面散射。

举例:月球漫反射

拿人在地球上看月球举例,月球本身不是自发光物体,光都来自漫反射太阳光,因为我们能观察到他的逆反射(如下图所示,图源水印),月球常被认为是一个应该使用粗糙次表面散射模型的例子。这是由于人站在地球上观察月球的观察尺度实在太大了,即使是月球上巨大规模的陨石坑,与散射距离相比起来都算是微结构。

逆反射:基于微观的

粗糙次表面散射自然要与表面的粗糙程度挂钩,此外还需要关注掠射逆反射

光学中(我表达得不一定严谨),

  • 掠射:指光从一种介质向另一种传播,入射角接近于90度时的情况,也就是几乎贴着反射面的入射
  • 逆反射:光线照射到表面后反射回到光源方向的现象

由于缺乏专业知识,百度了解了一下逆反射:

可见逆反射技术也是用非常微小的表面来实现光线折返,这意味着逆反射的发生更多是在微观的,这也解释了前面在介绍光滑次表面散射时为什么说“发生逆反射几率很小”。

由于表面粗糙,所以次表面散射过程中的逆反射可能性就加大了。在掠射角方向,视线和光线越靠近,则逆反射现象越明显。

考虑逆反射的重要性

前面提到的光滑次表面散射仅仅考虑了剔除了specular分出去的部分,本身Lambert漫反射边缘就很暗,剔除之后就更暗了,原本在掠射角处发生的逆反射现象被完全忽略(Lambert逆反射直接为0)。

所以模型计算中,逆反射一定要补上!

公式中的具体体现

  • FD_{90}:表示着掠射散射的强弱,大于1越强,小于1越弱
  • 粗糙度roughness:控制着临界点出现的早晚,符合“表面越粗糙,掠射角处就有越多微表面垂直于光线”,

6 Disney原则的BSDF*

BRDF --> BSDF标志着从专注于着色和光照转向了路径追踪全局照明,BSDF将折射、次表面散射和间接光照都被整合在了一起,遵循能量守恒就变得更加重要了。

路径追踪我也在学习101的时候写了小部分的内容:

GAMES101作业7-路径追踪实现过程&代码框架超全解读

BSDF可以渲染更加多的例子(图源水印):

但由于:

我打算BSDF先提到这里,之后有时间再学习起来~

参考

着色模型与PBR原理综述 - 知乎 (zhihu.com)

【基于物理的渲染(PBR)白皮书】(三)迪士尼原则的BRDF与BSDF相关总结

【译 】Disney2015-将BRDF扩展至集成次表面散射的BSDF - 知乎 (zhihu.com)

【渲染】Disney BSDF 深度解析 - 知乎 (zhihu.com)

BRDF理论及shader实现(下)__子宽的博客-CSDN博客_brdf f0 f90

基于物理的光照推演(一) - 知乎 (zhihu.com)

什么是光照模型 - 知乎 (zhihu.com)

<think>好的,用户想在Unity中实现基于PBR的风格化草渲染。我需要先理清PBR风格化如何结合。PBR通常追求物理准确,但风格化需要艺术化的调整,所以可能需要修改模型,保留部分PBR特性,比如能量守恒,同时引入非真实的着色方法。 首先,草的几何形状是关键。用户可能想要动态效果,比如随风摆动。可以考虑使用顶点着色器处理摆动,用噪声纹理或正弦波模拟运动。同时,草的模型要简单,可能用交叉的面片(cross-quad)或者自定义的几何着色器生成,但移动端可能需要注意性能。 材质方面,Albedo贴图需要风格化的颜色纹理,可能有渐变或手绘效果。PBR的金属度粗糙度贴图可能需要调整,比如降低粗糙度变化,让高更统一。或者完全自定义高效果,比如卡通化的高块。 部分PBRBRDFDisney或UE4的模型需要调整。可以简化漫反射,用Lambert加上渐变,或者Wrap Lighting来柔化阴影。镜面反射部分,可以用Blinn-Phong代替GGX,控制高大小强度,使其更风格化。 法线贴图可能不需要太复杂的细节,可以用平铺的法线贴图给草叶增加一些纹理,但强度调低,避免过于真实。或者完全不用法线,用顶点法线调整整体照方向。 环境照方面,风格化可能不需要IBL,但可以用简单的环境色或渐变天空盒来影响草的色调。可以考虑在Shader中加入自定义的环境影响。 着色器结构方面,可能需要Surface Shader或Shader Graph。如果用Shader Graph,可以更直观地混合PBR节点自定义效果。比如将Albedo与渐变贴图混合,修改Smoothness的输入源。 风的实现,在Shader中用世界坐标的噪声纹理采样,加上时间风速参数,影响顶点位置。注意顶点动画的性能,可能需要限制影响的幅度,或者分区域计算。 LOD剔除也很重要,远处的草可以减少面片数量或切换为更简单的模型,用抖动渐变避免突兀的切换。GPU Instancing可以提升渲染效率,特别是大面积的草地。 最后,测试不同照条件下的效果,调整参数达到艺术风格的需求。可能需要参考其他风格化游戏的做法,比如《塞尔达传说》中的草,结合PBR的基础,但简化或夸张某些照反应。</think>在Unity中实现基于PBR的风格化草渲染需要结合物理渲染基础艺术化处理,以下是分步骤实现方案: 1. **基础几何构建** - 使用交叉四边形(cross-quad)或自定义面片 - 通过几何着色器生成叶片(移动端建议预生成) ```hlsl // 示例几何着色器叶片生成 [maxvertexcount(3)] void geom(point v2g input[1], inout TriangleStream<g2f> triStream) { g2f o; // 生成三角形顶点数据 // 添加顶点位置偏移形成叶片形状 } ``` 2. **PBR材质核心参数** ```mathematica Albedo = 渐变绿色纹理采样(如$$Color_{base} = tex2D(_MainTex, uv) \times 0.8 + 0.2$$) Smoothness = 0.3-0.5(保持适度泽) Metallic = 0(草为非金属材质) ``` 3. **风格化照改造** - 漫反射使用Lambert + 渐变修正: ```hlsl half4 LightingStylizedGrass (SurfaceOutput s, half3 lightDir, half atten) { half NdotL = dot(s.Normal, lightDir); half ramp = smoothstep(0, 0.7, NdotL); // 硬边缘渐变 half4 c; c.rgb = s.Albedo * _LightColor0.rgb * ramp * atten; c.a = s.Alpha; return c; } ``` 4. **动态风场模拟** ```hlsl // 顶点着色器中添加风力影响 float windStrength = _WindSpeed * sin(_Time.y + posWS.x * _WindFrequency); v.vertex.x += windStrength * _WindDirection.x * noiseTex.SampleLevel(sampler_noiseTex, uv, 0).r; v.vertex.z += windStrength * _WindDirection.y * noiseTex.SampleLevel(sampler_noiseTex, uv, 0).g; ``` 5. **高级特性实现** - **边缘透**:添加次表面散射效果 ```hlsl float backLit = saturate(dot(-lightDir, viewDir)); col.rgb += _SubsurfaceColor * backLit * (1 - NdotL); ``` - **交互变形**:使用球体碰撞器检测 ```csharp void Update(){ foreach(var col in Physics.OverlapSphere(transform.position, _Radius)){ ApplyVertexDisplacement(col.transform.position); } } ``` 6. **性能优化方案** - GPU Instancing配置: ```hlsl #pragma multi_compile_instancing UNITY_INSTANCING_BUFFER_START(Props) UNITY_DEFINE_INSTANCED_PROP(float4, _ColorVariation) UNITY_INSTANCING_BUFFER_END(Props) ``` - LOD分级策略: ``` LOD0:完整细节(<10m) LOD1:简化面片(10-20m) LOD2:卡片式渲染(>20m) ``` 实现要点: 1. 在Shader中混合PBR照计算风格化处理 2. 使用噪声纹理驱动自然随机运动 3. 通过顶点颜色控制个体差异(如颜色偏移、摆动幅度) 4. 配置合理的渲染队列(建议使用AlphaTest) 5. 添加基于距离的视差效果增强空间感 最终效果调节建议: - 保持镜面反射强度在0.2-0.4之间 - 使用自定义阴影色(如偏蓝的暗部) - 添加全局高度渐变(草根到草尖颜色变化) - 实现与场景灯的适配性测试(昼夜变化场景)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九九345

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值