技术美术TA之PBR

本文是视频课程《Unity技术美术TA:Shader篇》,算是对自己学习的总结,也希望分享下所学知识~~

什么是PBR?
Physically Based Rendering,基于物理的渲染
是一种渲染方式,基于物理原理和微平面理论的光照模型,从现实中测量的参数准确的表示真实世界
(并不一定是真实的,也可以用RBP做卡通渲染)

RBR是一系列技术合集:GI、PBS

什么是PBS?
Physically Based Shadering,基于物理的着色
为了对光和材质之间进行更加真实的建模,核心

Unity中的PBS,分为:
1.Standard(金属向,常用)
2.Standard Specular Setup(高光向)

PBS的核心理论:

1.物质的光学性质(Substance Optical Properties)
渲染大体分为两类:

  • 金属
    • 有很高的反射率(≥ 0.5)
    • 金属只会产生自高光反射,没有漫反射
    • 不同金属的反射颜色不一致
  • 非金属
    • 非金属反射率低(≤ 0.06)
    • 非金属会产生高光+漫反射
    • 非金属的高光反射颜色为单色/灰色

2.微平面理论(Micorfacet Theory)
对于不是光学光滑的平面的表面对光有不同的反射和折射
PBS 假定任何平面都是由微平面组成的,通过粗糙度贴图或者高光度贴图表示

平面越粗擦,微平面排列越混乱,高光反射越模糊
平面越光滑,微平面排列越有序,高光反射更清晰、锐利

3.能量守恒(Energy Conservation)
出射光线的能量永远不能超过入射光线的能量

粗糙度上升,镜面反射面积区域会增加,镜面反射的亮度就会降低

4.菲涅尔反射(Fresnel Reflection)
菲涅尔效应:光线的反射率与视角有关
光源入射方向与平面法线的夹角越大,反射越大,亮度越大。
夹角越小,反射越小,亮度越小。

5.线性光照空间(Linear Space Lighting)
下一章具体说


渲染方程:
根据光的物理学原理,渲染方程可以完美表现出结果

在这里插入图片描述

其中 f® 是当前点的入射方向到出射方向光的反射比例,为BxDF

BSSRF:双向表面散射反射分布函数(双向 = 光入射方向+视线方向)
BRDF:双向反射分布函数
BTDF:双向透射分布函数
BSDF:双向散射分布函数(BSDF = BRDF + BTDF)


迪士尼原则的 BRDF
2012年,Disney Principled BRDF,用简单易懂的参数和高度完善的美术工作流程
核心理念:
1.使用直观参数,不是晦涩的物理类参数
2.参数尽可能少
3.参数在其合理范围内应为0-1
4.允许参数在有意义的情况下超出正常的范围
5.所有参数组应该尽可能的健壮与合理

标准图:
在这里插入图片描述

参数:
(加粗表示常用)
BaseColor:表面颜色,通常由纹理提供
Subsurface:次表面颜色,控制漫反射形状
Metallic:金属度,0是非金属,1是金属,两种不同模式之间的线性混合
Specular:镜面反射强度
SpecularTint:对BaseColor的入射镜面反射进行的颜色控制
Roughness:粗糙度,表面粗糙度,控制漫反射和镜面反射
Anisotropic:各向异性强度,控制镜面高光反射的横纵比,一般都是各向同性的
Sheen:光泽度,一种额外的掠射分量,用于布料
SheenTint:光泽颜色,对Sheen的颜色控制
ClearCoat:清漆强度,特殊用途的第二个镜面波瓣
ClearCoatGloss:清漆光泽度,控制透明图层的光泽度


Unity 内部实现
(代码比较多,可以自己看看,这里只说一些概念的东西)

公式:
最终颜色=漫反射+镜面反射+GI满反射+GI镜面反射

主要是两个函数

//1.GI计算
//				=====> 得出 GI满反射+GI镜面反射
LightingStandard_GI

//2.光照计算
//				=====> 得出 满反射+镜面反射
LightingStandard


//迪士尼漫反射公式
half DisneyDiffuse(half NdotV, half NdotL, half LdotH, half perceptualRoughness)
{
    half fd90 = 0.5 + 2 * LdotH * LdotH * perceptualRoughness;
    // Two schlick fresnel term
    half lightScatter   = (1 + (fd90 - 1) * Pow5(1 - NdotL));
    half viewScatter    = (1 + (fd90 - 1) * Pow5(1 - NdotV));

    return lightScatter * viewScatter;
}

    //计算漫反射部分
    half3 diffuse = diffColor * (gi.diffuse + light.color * diffuseTerm);
    //计算高光反射部分 DFG/4 cosl cosv
    half3 specular = specularTerm * light.color * FresnelTerm(specColor, lh);
    // ibl(Image Based Lighting)
    // 基于图像的光照
    half3 ibl = surfaceReduction * gi.specular * FresnelLerp(specColor, grazingTerm, nv);

    half3 color = diffuse + specular + ibl;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值