PBR-BRDF-Disney-Unity-1

本筆記首發(fā)知乎:https://zhuanlan.zhihu.com/p/260922654
時(shí)間: 2020-7到12月
修改:20201213
聲明:此文為個(gè)人學(xué)習(xí)筆記厚满,自己溫習(xí)疫蔓,也樂(lè)在交流蕾久。如果文章中有侵權(quán)荞估,錯(cuò)誤中鼠,或者有不同的理解驾讲,煩請(qǐng)大家多多留言:指正蚊伞,指教,鄙人會(huì)及時(shí)糾正吮铭。此致崇高敬意时迫!
認(rèn)知:微表面理論,能量守理論等等(見參考資料)......
PBR系列筆記共三篇谓晌,本篇為系列第一篇:基于 Disney BRDF 算法分析


目錄

  • 前言
  • Disney BRDF 源碼及對(duì)應(yīng)實(shí)現(xiàn)

前言
PBR:前PBR與現(xiàn)PBR掠拳。前PBR:不方便使用,渲染不盡人意纸肉,非藝術(shù)為導(dǎo)向溺欧。 現(xiàn)PBR:算法優(yōu)化喊熟,藝術(shù)為導(dǎo)向,節(jié)省時(shí)間成本姐刁。在主觀(藝術(shù)效果)與客觀(物理真實(shí))上找到新的平橫芥牌。犧牲物理,提高藝術(shù)效果聂使,又或者是犧牲藝術(shù)效果壁拉,提升物理準(zhǔn)確等。
從迪斯尼發(fā)表的演講與開源柏靶,給了業(yè)界標(biāo)準(zhǔn):總是以藝術(shù)為導(dǎo)向(藝術(shù)至上)弃理;核心可控參數(shù)簡(jiǎn)潔;物質(zhì)的采樣數(shù)據(jù)的共享......等等(慷慨的分享屎蜓,讓人敬佩)痘昌。
如彼得-德魯克大師說(shuō)的一樣,要看榮譽(yù)炬转,就要看貢獻(xiàn)辆苔;看對(duì)整個(gè)社會(huì)的貢獻(xiàn),對(duì)整人類群體返吻,和整個(gè)文明的貢獻(xiàn)姑子。迪斯尼的這次演講與開源對(duì)于物理渲染技術(shù)有著劃時(shí)代的意義。
淺談的前提知識(shí):色彩空間(見前文《淺談-色彩空間》常見圖形學(xué)里面的數(shù)據(jù)操控测僵,系統(tǒng)筆記街佑,前篇筆記是后篇筆記所需的基礎(chǔ)知識(shí))。
https://zhuanlan.zhihu.com/p/203847313zhuanlan.zhihu.com


Disney-BRDF源碼
https://github.com/wdas/brdf/blob/master/src/brdfs/disney.brdfgithub.com

analytic
# Copyright Disney Enterprises, Inc.  All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License
# and the following modification to it: Section 6 Trademarks.
# deleted and replaced with:
#
# 6. Trademarks. This License does not grant permission to use the
# trade names, trademarks, service marks, or product names of the
# Licensor and its affiliates, except as required for reproducing
# the content of the NOTICE file.
#
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# variables go here...
# [type] [name] [min val] [max val] [default val]
::begin parameters
color baseColor .82 .67 .16
//固有色
float metallic 0 1 0
//金屬度(金屬(0 = 電介質(zhì)捍靠,1 =金屬沐旨,0-1之間半導(dǎo)體)非特殊需要切勿使用半導(dǎo)體調(diào)效果
float subsurface 0 1 0
//次表面,控制漫反射形狀
float specular 0 1 .5
//鏡面反射強(qiáng)度,取代折射率
float roughness 0 1 .5
//粗糙度榨婆,控制漫反射和鏡面反射
float specularTint 0 1 0
//鏡面反射顏色磁携,物理向美術(shù)的讓步
float anisotropic 0 1 0
//各向異性,高光的縱橫比
float sheen 0 1 0
//光澤度良风,用于布料
float sheenTint 0 1 .5
//光澤顏色谊迄,sheen顏色控制
float clearcoat 0 1 0
//清漆,第二層高光
float clearcoatGloss 0 1 1
//清漆光澤度烟央,0 = “緞面(satin)”统诺,1 = “光澤(gloss)”
::end parameters
::begin shader
const float PI = 3.14159265358979323846;
//圓周率
float sqr(float x) { return x*x; }
//平方
float SchlickFresnel(float u)
{//SchlickFresnel 菲涅耳
    float m = clamp(1-u, 0, 1);
              //反向,并限制在0-1范圍內(nèi)
    float m2 = m*m;
              //平方
    return m2*m2*m; // 5次方
}
float GTR1(float NdotH, float a)
{
    if (a >= 1) return 1/PI;
    //如果a大于等于1疑俭,就返回圓周率倒數(shù)
    float a2 = a*a;
    float t = 1 + (a2-1)*NdotH*NdotH;
    return (a2-1) / (PI*log(a2)*t);
}
float GTR2(float NdotH, float a)
{
    float a2 = a*a;
    float t = 1 + (a2-1)*NdotH*NdotH;
    return a2 / (PI * t*t);
}
float GTR2_aniso(float NdotH, float HdotX, float HdotY, float ax, float ay)
{
    return 1 / (PI * ax*ay * sqr( sqr(HdotX/ax) + sqr(HdotY/ay) + NdotH*NdotH ));
}
float smithG_GGX(float NdotV, float alphaG)
{
    float a = alphaG*alphaG;
    float b = NdotV*NdotV;
    return 1 / (NdotV + sqrt(a + b - a*b));
}
float smithG_GGX_aniso(float NdotV, float VdotX, float VdotY, float ax, float ay)
{
    return 1 / (NdotV + sqrt( sqr(VdotX*ax) + sqr(VdotY*ay) + sqr(NdotV) ));
}
vec3 mon2lin(vec3 x)
{
    return vec3(pow(x[0], 2.2), pow(x[1], 2.2), pow(x[2], 2.2));
}
vec3 BRDF( vec3 L, vec3 V, vec3 N, vec3 X, vec3 Y )
{
    float NdotL = dot(N,L);
    float NdotV = dot(N,V);
    if (NdotL < 0 || NdotV < 0) return vec3(0);
    //限制條件粮呢,如果小于0,則無(wú)意義
    vec3 H = normalize(L+V);
    float NdotH = dot(N,H);
    float LdotH = dot(L,H);
    vec3 Cdlin = mon2lin(baseColor);
    float Cdlum = .3*Cdlin[0] + .6*Cdlin[1]  + .1*Cdlin[2]; // luminance approx.
    vec3 Ctint = Cdlum > 0 ? Cdlin/Cdlum : vec3(1); // normalize lum. to isolate hue+sat
    vec3 Cspec0 = mix(specular*.08*mix(vec3(1), Ctint, specularTint), Cdlin, metallic);
    vec3 Csheen = mix(vec3(1), Ctint, sheenTint);
    // Diffuse fresnel - 從正常入射的1到放牧的0.5
    // 并根據(jù)粗糙度混合漫反射回射
    float FL = SchlickFresnel(NdotL), FV = SchlickFresnel(NdotV);
    float Fd90 = 0.5 + 2 * LdotH*LdotH * roughness;
    float Fd = mix(1.0, Fd90, FL) * mix(1.0, Fd90, FV);
     //基于各向同性bssrdf的Hanrahan-Krueger brdf逼近
     // 1.25刻度用于(大致)保留反照率
     // Fss90用于“平整”基于粗糙度的回射
    float Fss90 = LdotH*LdotH*roughness;
    float Fss = mix(1.0, Fss90, FL) * mix(1.0, Fss90, FV);
    float ss = 1.25 * (Fss * (1 / (NdotL + NdotV) - .5) + .5);
    // specular
    float aspect = sqrt(1-anisotropic*.9);
    float ax = max(.001, sqr(roughness)/aspect);
    float ay = max(.001, sqr(roughness)*aspect);
    float Ds = GTR2_aniso(NdotH, dot(H, X), dot(H, Y), ax, ay);
    float FH = SchlickFresnel(LdotH);
    vec3 Fs = mix(Cspec0, vec3(1), FH);
    float Gs;
    Gs  = smithG_GGX_aniso(NdotL, dot(L, X), dot(L, Y), ax, ay);
    Gs *= smithG_GGX_aniso(NdotV, dot(V, X), dot(V, Y), ax, ay);
    // sheen
    vec3 Fsheen = FH * sheen * Csheen;
    // clearcoat (ior = 1.5 -> F0 = 0.04)
    float Dr = GTR1(NdotH, mix(.1,.001,clearcoatGloss));
    float Fr = mix(.04, 1.0, FH);
    float Gr = smithG_GGX(NdotL, .25) * smithG_GGX(NdotV, .25);
    return ((1/PI) * mix(Fd, ss, subsurface)*Cdlin + Fsheen)
        * (1-metallic)
        + Gs*Fs*Ds + .25*clearcoat*Gr*Fr*Dr;
}
::end shader

Disney-BRDF分解實(shí)現(xiàn)
路線與分析:
第一,數(shù)據(jù)資源啄寡,在方程計(jì)算前豪硅,接入數(shù)據(jù)的正確性。
配套的貼圖資源要正確挺物。區(qū)分Gamma空間Linear空間數(shù)據(jù)資源懒浮。PBR工作流有兩個(gè)方向,Specular流姻乓,和Metallic工作流嵌溢。近年游戲中主引用Metallic工作流,主要原因是通道的拆分利于迭代(參數(shù)更直觀蹋岩,數(shù)值計(jì)算也更準(zhǔn)確),會(huì)節(jié)省更多時(shí)間成本学少。而本筆記也是基于Metallic流剪个。不同的工作流方向貼圖資源也不一樣。
第二版确,Disney Function分析(源碼分析):

Disney-BRDF 模型方程

方程簡(jiǎn)要說(shuō)明:基于微觀表面和能量守恒等理論扣囊。

  1. diffuse 漫反射,通常假定表示為蘭伯特?cái)U(kuò)散項(xiàng)绒疗,是一個(gè)恒定不變的值侵歇。
  2. 右邊分?jǐn)?shù)形式為specular鏡面反射項(xiàng):
    D 是微觀表面法線方向分布。鏡面反射的高光吓蘑,高光形狀惕虑;
    F 為菲涅耳反射,系數(shù)磨镶;
    G 為微觀表面幾何變化溃蔫,微觀幾何項(xiàng),微觀表面的陰影和蒙板(遮罩)琳猫,因子伟叛。
    θh 是法線 n 和半矢量 h 之間的角度,NdotH脐嫂;
    θd 是 l 與 h 半矢量h之間的“差”角(或?qū)ΨQ地為 v 和 h )统刮,LdotH 或者 VdotH;
    θl 是 l 向量相對(duì)于法線 n 的入射角,NdotL账千;
    θv 是 v 向量相對(duì)于法線 n 的入射角侥蒙,NdotV。
LdotH 和 VdotH對(duì)角角度等同蕊爵。點(diǎn)積是計(jì)算Cos角度辉哥,效果等同。見下文圖例:2017-鏡面D觀測(cè)

整個(gè)函數(shù)對(duì)于第一眼來(lái)說(shuō),太過(guò)復(fù)雜龐大醋旦。里面的參數(shù)也是復(fù)雜的讓人不知所措恒水。所以有一個(gè)更好的方法:拆分看。(函數(shù)為diffuse(漫反射)+specular(鏡面反射))
第一部分:diffuse 次表面散射:漫反射項(xiàng) (文獻(xiàn)指出漫反射項(xiàng)是歸類到次表面散射項(xiàng)內(nèi))
擴(kuò)散模型饲齐。通常假設(shè)钉凌,并用 Lambert 擴(kuò)散的一個(gè)恒定值來(lái)表示(漫反射在所有方向上的強(qiáng)度都是相同的,所以要除以π)所以普通Lambert與BRDF Lambert是不一樣的(普通的Lambert lightmode ndl因子是在BRDF diffuse反射等式中的一部分)捂人。閑扯:萬(wàn)物皆有散射御雕,金屬也不例外,只是在計(jì)算模擬時(shí)滥搭,宏觀上刻意忽略微弱的計(jì)算(能量守恒酸纲,只有黑洞能完全吸收能量,無(wú)反射能量)瑟匆。
三種基本BRDF diffuse模型:Lambert闽坡,Oren-Nayar,Hanrahan-Krueger

Disney diffuse

其中

參數(shù):
baseColor 表面顏色(根據(jù)貼圖metallic信息計(jì)算過(guò)后的diffColor愁溜,MetallicSetup內(nèi))
roughness 粗糙度
cosθl NdotL
cosθv NdotV
cosθd LdotH 或者 VdotH
cosθd 的兩種不同寫法疾嗅,一種unity LdotH,迪斯尼 LdotH冕象,一種是 UE VoH代承。

// Unity UnityStandardBRDF.cginc 文件內(nèi)
// 注意:迪士尼漫反射必須乘以diffuse Albedo / PI。 這是在此功能之外完成的渐扮。
half DisneyDiffuse(half NdotV, half NdotL, half LdotH, half perceptualRoughness)
{
    half fd90 = 0.5 + 2 * LdotH * LdotH * perceptualRoughness;
    // 兩個(gè)schlick菲涅耳術(shù)語(yǔ)
    half lightScatter   = (1 + (fd90 - 1) * Pow5(1 - NdotL));
    half viewScatter    = (1 + (fd90 - 1) * Pow5(1 - NdotV));
    return lightScatter * viewScatter;
}
//BRDF1_Unity_PBS 
// DisneyDiffuse 項(xiàng)
    half diffuseTerm = DisneyDiffuse(nv, nl, lh, perceptualRoughness) * nl;
// 在這里乘了 nl

// UE4 BRDF.ush文件內(nèi)
// [Burley 2012, "Physically-Based Shading at Disney"]
float3 Diffuse_Burley( float3 DiffuseColor, float Roughness, float NoV, float NoL, float VoH )
{
    float FD90 = 0.5 + 2 * VoH * VoH * Roughness;
    float FdV = 1 + (FD90 - 1) * Pow5( 1 - NoV );
    float FdL = 1 + (FD90 - 1) * Pow5( 1 - NoL );
    return DiffuseColor * ( (1 / PI) * FdV * FdL );
}

第二部分:公式右側(cè)部分(表面反射:高光反射項(xiàng))
Unity實(shí)現(xiàn)與迪斯尼公式的有些不同:DFG(迪斯尼) ---->> DFV(unity)论悴,把G項(xiàng)替換成了V項(xiàng),但整體框架一樣席爽。在unity URP LitShader的直接光照部分里有祥細(xì)的注釋說(shuō)明意荤。
2.1、D(θh) 鏡面D觀測(cè)(微觀表面法線方向分布)鏡面反射的高光只锻,高光形狀玖像。

幾種鏡面分布適合MERL鉻。 左:鏡面反射峰對(duì)數(shù)的對(duì)數(shù)標(biāo)度圖θh(度)齐饮; 黑色=鉻捐寥,紅色= GGX(α= 0.006),綠色= Beckmann(m = 0.013)祖驱,藍(lán)色= BlinnPhong(n = 12000)握恳。 右:鉻,GGX和Beckmann貝克曼的點(diǎn)光響應(yīng)

引入并稱為Generalized-Trowbridge-Reitz捺僻,或者GTR乡洼。

參數(shù):
c 縮放系數(shù)(scaling constant)
α 粗糙度參數(shù)(roughness parameter俗稱感性粗糙度崇裁,roughness map)在0-1之間
θh 為ndh
γ 指數(shù)值

各種γ值的GTR分布曲線與θh的關(guān)系

在BRDF中,GTR 2(主鏡面波瓣) 先用于基礎(chǔ)層材質(zhì)(Base Material)各向異性和或者各項(xiàng)同性的金屬或非金屬(俗稱下層高光)束昵;GTR 1 (次鏡面波瓣)次用于上層透明涂層材質(zhì)(ClearCoat清漆材質(zhì)拔稳,俗稱上層高光),是各向同性且非金屬的锹雏。(兩層高光概念巴比,例如車漆:金屬材質(zhì)層+清漆材質(zhì)層,而清漆的厚度納入計(jì)算礁遵,清漆在上金屬在下轻绞,且兩層都有對(duì)應(yīng)不同的高光效果。發(fā)展趨勢(shì):更復(fù)雜的多層高光計(jì)算)

// UnityBuiltin UnityStandardBRDF.cginc 文件內(nèi)
inline float GGXTerm (float NdotH, float roughness)
{  //對(duì)應(yīng)迪斯尼GTR2 下層
    float a2 = roughness * roughness;
    float d = (NdotH * a2 - NdotH) * NdotH + 1.0f; // 2 mad
    return UNITY_INV_PI * a2 / (d * d + 1e-7f); //此功能不適合在Mobile上運(yùn)行佣耐,
                                             //因此epsilon小于一半
}

// UE4 BRDF.ush文件內(nèi) Anisotropic GGX
// [Burley 2012, "Physically-Based Shading at Disney"]
float D_GGXaniso( float ax, float ay, float NoH, float3 H, float3 X, float3 Y )
{
    float XoH = dot( X, H );
    float YoH = dot( Y, H );
    float d = XoH*XoH / (ax*ax) + YoH*YoH / (ay*ay) + NoH*NoH;
    return 1 / ( PI * ax*ay * d*d );
} 

Disney GTR(GTR1是γ=1政勃,GTR2是γ=2)

float GTR1(float NdotH, float a)
{
    if (a >= 1) return 1/PI;
    //如果a大于等于1,就返回圓周率倒數(shù)
    float a2 = a*a;
    float t = 1 + (a2-1)*NdotH*NdotH;
    return (a2-1) / (PI*log(a2)*t);
}
float GTR2(float NdotH, float a)
{
    float a2 = a*a;
    float t = 1 + (a2-1)*NdotH*NdotH;
    return a2 / (PI * t*t);
}

//各項(xiàng)異性版本
float GTR2_aniso(float NdotH, float HdotX, float HdotY, float ax, float ay)
{
    return 1 / (PI * ax*ay * sqr( sqr(HdotX/ax) + sqr(HdotY/ay) + NdotH*NdotH ));
}
2017-鏡面D觀測(cè) 用于計(jì)算有多少比例(后圖圓圈表示)的微面元的法線滿足m=h兼砖,當(dāng)滿足條件后的微表面才會(huì)把光線從l反射到v上稼病,注間手寫m項(xiàng)向量。
2017-BRDF 忽略出入射線距離掖鱼,圓圈區(qū)域的大小定義,在理論計(jì)算中很重要(計(jì)算有多少比例的微面元)援制。采樣范圍跟性能直接掛勾
2017-BSSRDF 計(jì)算出入射線距離

設(shè)定圓的大小做為判斷值戏挡,來(lái)確定需渲染的精度。

2.2晨仑、F(θd)鏡面F觀測(cè)(菲涅耳反射)

參數(shù):
F0 鏡面反射率褐墅,lerp (恒定值, albedo, metallic)所得。恒定值跟數(shù)據(jù)色彩空間直接關(guān)聯(lián)洪己,色彩空間不一樣妥凳,值也不一樣。
cosθd 的兩種不同寫法答捕,一種hdl (unity LdotH逝钥,迪斯尼 LdotH),一種是hdv(UE VoH)拱镐。
閑扯:萬(wàn)物皆有菲涅耳反射艘款。

左為菲涅耳反射
//公式中使用的是dot(v,h)。而Unity默認(rèn)傳入的是dot(l,h)
//是因?yàn)锽RDF大量的計(jì)算使用的是l,h的點(diǎn)積沃琅,而h是l和v的半角向量哗咆,所以lh和vh的夾角是一樣的。
//不需要多來(lái)一個(gè)變量益眉。
// UnityBuiltin UnityStandardBRDF.cginc 文件內(nèi)
inline half Pow5 (half x) //性能優(yōu)化
{
    return x*x * x*x * x;
}
inline half3 FresnelTerm (half3 F0, half cosA) //對(duì)應(yīng)迪斯尼F項(xiàng)
{
    half t = Pow5 (1 - cosA);   // ala Schlick插值
    //公式中使用的是dot(v,h)晌柬。而Unity默認(rèn)傳入的是dot(l,h)
    //是因?yàn)锽RDF大量的計(jì)算使用的是l,h的點(diǎn)積姥份,而h是l和v的半角向量,所以lh和vh的夾角是一樣的年碘。不需要多來(lái)一個(gè)變量澈歉。
    return F0 + (1-F0) * t;
}

// UE4 BRDF.ush文件內(nèi)
// [Schlick 1994, "An Inexpensive BRDF Model for Physically-Based Rendering"]
float3 F_Schlick( float3 SpecularColor, float VoH )
{
    float Fc = Pow5( 1 - VoH );                 // 1 sub, 3 mul
    //return Fc + (1 - Fc) * SpecularColor;     // 1 add, 3 mad

    // Anything less than 2% is physically impossible and is instead considered to be shadowing
    return saturate( 50.0 * SpecularColor.g ) * Fc + (1 - Fc) * SpecularColor;

}

float3 F_Fresnel( float3 SpecularColor, float VoH )
{
    float3 SpecularColorSqrt = sqrt( clamp( float3(0, 0, 0), float3(0.99, 0.99, 0.99), SpecularColor ) );
    float3 n = ( 1 + SpecularColorSqrt ) / ( 1 - SpecularColorSqrt );
    float3 g = sqrt( n*n + VoH*VoH - 1 );
    return 0.5 * Square( (g - VoH) / (g + VoH) ) * ( 1 + Square( ((g+VoH)*VoH - 1) / ((g-VoH)*VoH + 1) ) );
}

2.3、G(θl,θv)鏡面G微觀表面幾何變化盛泡,微觀幾何項(xiàng)闷祥,微觀表面的陰影和蒙板(遮罩)(Unity V項(xiàng)等同) 最復(fù)雜的項(xiàng)

BRDF-V
MERL 100材料的反照率圖。左:50種光滑的材料傲诵;右:50種粗糙的材料凯砍。
比較多個(gè)鏡面反射G模型的反照率圖。 所有地塊都使用相同的D(GGX / TR)和F因素拴竹。 左:光滑的表面(α= 0.02)悟衩; 右:粗糙表面(α= 0.5)。 “無(wú)G”模式排除G和 1/cosθlcosθv因素

三種粗糙分布模型:Kurt的經(jīng)驗(yàn)?zāi)P停〝?shù)據(jù)擬合)栓拜,沃爾特(Walter)的史密斯(Smith)G衍生品座泳,什里克(Schlick)的更簡(jiǎn)單的衍生品粗糙度作為自由參數(shù)

本文本章節(jié)對(duì)應(yīng)圖示(微觀的陰影和蒙板(遮罩)),只計(jì)算一次的反射模型幕与。部分射線有入射無(wú)出射示例挑势。只計(jì)算一次有效反射
非本文更復(fù)雜算法,多次反射計(jì)算啦鸣,也是通用的烘焙使用
// UnityBuiltin UnityStandardBRDF.cginc 文件內(nèi)
// 低效果版本 V 項(xiàng)潮饱,但性能更好
//注意:可見性術(shù)語(yǔ)是Torrance-Sparrow模型的完整形式,其中包括幾何術(shù)語(yǔ):V = G /(N.L * N.V)
//這樣一來(lái)诫给,交換幾何圖形項(xiàng)變得更加容易香拉,并且有更多的優(yōu)化空間(也許在 CookTorrance geom項(xiàng)的情況下除外)
// 通用Smith-Schlick能見度術(shù)語(yǔ)
inline half SmithVisibilityTerm (half NdotL, half NdotV, half k)
{
    half gL = NdotL * (1-k) + k;
    half gV = NdotV * (1-k) + k;
    return 1.0 / (gL * gV + 1e-5f); //此功能不適合在Mobile上運(yùn)行,
                                     //因此epsilon小于可以表示為一半的值
}
// Smith-Schlick 是貝克曼的作品
inline half SmithBeckmannVisibilityTerm (half NdotL, half NdotV, half roughness)
{
    half c = 0.797884560802865h; // c = sqrt(2 / Pi)
    half k = roughness * c;
    return SmithVisibilityTerm (NdotL, NdotV, k) * 0.25f; // * 0.25是可見性項(xiàng)的1/4
}

// 高效果版本 V 項(xiàng)
// Ref: http://jcgt.org/published/0003/02/03/paper.pdf  2014年文獻(xiàn)
// 可見性項(xiàng)(包括幾何函數(shù)和配平系數(shù)一起)的計(jì)算
inline float SmithJointGGXVisibilityTerm (float NdotL, float NdotV, float roughness)
{
    #if 0  //默認(rèn)關(guān)閉中狂,備注凫碌,這里是 Frostbite的GGX-Smith Joint方案(精確,但是需要開方兩次胃榕,很不經(jīng)濟(jì))
        // 原始配方:
        //  lambda_v    = (-1 + sqrt(a2 * (1 - NdotL2) / NdotL2 + 1)) * 0.5f;
        //  lambda_l    = (-1 + sqrt(a2 * (1 - NdotV2) / NdotV2 + 1)) * 0.5f;
        //  G           = 1 / (1 + lambda_v + lambda_l);
        // 重新排序代碼以使其更優(yōu)化
        half a          = roughness;
        half a2         = a * a;
        half lambdaV    = NdotL * sqrt((-NdotV * a2 + NdotV) * NdotV + a2);
        half lambdaL    = NdotV * sqrt((-NdotL * a2 + NdotL) * NdotL + a2);
        // 簡(jiǎn)化可見性術(shù)語(yǔ): (2.0f * NdotL * NdotV) /  ((4.0f * NdotL * NdotV) * (lambda_v + lambda_l + 1e-5f));
        return 0.5f / (lambdaV + lambdaL + 1e-5f);  //此功能不適合在Mobile上運(yùn)行盛险,
                                                    //因此epsilon小于可以表示為一半的值
    #else
        // 走這個(gè)部分
        // 近似值(簡(jiǎn)化sqrt,在數(shù)學(xué)上不正確勤晚,但足夠接近)
        // 這個(gè)部分是Respawn Entertainment的 GGX-Smith Joint近似方案
        float a = roughness;
        float lambdaV = NdotL * (NdotV * (1 - a) + a);
        float lambdaL = NdotV * (NdotL * (1 - a) + a);
        #if defined(SHADER_API_SWITCH)
            return 0.5f / (lambdaV + lambdaL + 1e-4f); //解決hlslcc舍入錯(cuò)誤的解決方法
        #else
            return 0.5f / (lambdaV + lambdaL + 1e-5f);
        #endif
    #endif
}

// UE
// Smith GGX G項(xiàng)枉层,各項(xiàng)同性版本
float smithG_GGX(float NdotV, float alphaG)
{
    float a = alphaG * alphaG;
    float b = NdotV * NdotV;
    return 1 / (NdotV + sqrt(a + b - a * b));
}
// Smith GGX G項(xiàng),各項(xiàng)異性版本
// Derived G function for GGX
float smithG_GGX_aniso(float dotVN, float dotVX, float dotVY, float ax, float ay)
{
    return 1.0 / (dotVN + sqrt(pow(dotVX * ax, 2.0) + pow(dotVY * ay, 2.0) + pow(dotVN, 2.0)));
}
// GGX清漆幾何項(xiàng)
// G GGX function for clearcoat
float G_GGX(float dotVN, float alphag)
{
        float a = alphag * alphag;
        float b = dotVN * dotVN;
        return 1.0 / (dotVN + sqrt(a + b - a * b));
}

2.31赐写、1/4cosθlcosθv微觀幾何項(xiàng)的衍生項(xiàng)鸟蜡,用來(lái)矯正微觀表面到宏觀表面(整體)數(shù)量差異的校正因子

大多數(shù)沒有以微表面形式具體描述的物理上可行的模型,仍可以用微表面模型描述挺邀,因?yàn)樗鼈円簿哂蟹植己瘮?shù)揉忘,菲涅耳因子跳座,以及一些可以考慮為幾何陰影因子的其他因子。唯一的真正區(qū)別是微表面模型與其他模型之間是否包含顯式矯正因子:

顯式矯正因子

該顯式矯正因子來(lái)自微表面模型的衍生泣矛。對(duì)于不包含此因素的模型疲眷,配平使用:隱含陰影可以通過(guò)將模型除以 D 和 F后乘以4 cosθlcosθv來(lái)確定因子因素。
Unity V項(xiàng)(等同G項(xiàng)):BRDF函數(shù)擬合優(yōu)化項(xiàng)
見《PBR-BRDF-Disney-Unity-3》Fragment DirectBDRF 函數(shù)內(nèi)的說(shuō)明您朽。
2.4狂丝、布料;2.5哗总、虹彩(虹彩可以給美術(shù)一個(gè)五顏六色的黑:P几颜,略過(guò),有時(shí)間再深入學(xué)習(xí))


必讀參考資料:
Substance PBR 指導(dǎo)手冊(cè)
https://link.zhihu.com/?target=https%3A//academy.substance3d.com/courses/pbrguide
八猴 PBR 指導(dǎo)手冊(cè)
https://marmoset.co/posts/basic-theory-of-physically-based-rendering/marmoset.co
SIGGRAPH 2012年原版文章: 2012-Physically-Based Shading at Disney
https://media.disneyanimation.com/uploads/production/publication_asset/48/asset/s2012_pbs_disney_brdf_notes_v3.pdfmedia.disneyanimation.com
本人整理過(guò)后的中文版:
https://link.zhihu.com/?target=https%3A//github.com/MasterWangdaoyong/Shader-Graph/tree/main/Show/PBR-BRDF-Disney-Unity
SIGGRAPH 2017年原版文章: 2017-Reflectance Models (BRDF)
https://cgg.mff.cuni.cz/~pepca/lectures/pdf/pg2-05-brdf.en.pdfcgg.mff.cuni.cz
閆令琪(閆神):
https://link.zhihu.com/?target=http%3A//games-cn.org/
希望也有學(xué)101讯屈,102蛋哭,201,202的朋友討論溝通:)
個(gè)人學(xué)習(xí)注釋筆記地址:
https://github.com/MasterWangdaoyong/Shader-Graph/tree/main/Unity_SourceCodegithub.com
MasterWangdaoyong/Shader-Graph
https://github.com/MasterWangdaoyong/Shader-Graph/tree/main/Unity_SourceCodegithub.com
毛星云:https://zhuanlan.zhihu.com/p/60977923
雨軒:https://zhuanlan.zhihu.com/p/137039291
熊新科: 源碼解析 第10章節(jié) 第11章節(jié)
馮樂(lè)樂(lè):入門精要 第18章節(jié)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涮母,一起剝皮案震驚了整個(gè)濱河市谆趾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌叛本,老刑警劉巖沪蓬,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異来候,居然都是意外死亡怜跑,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門吠勘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人峡眶,你說(shuō)我怎么就攤上這事剧防。” “怎么了辫樱?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵峭拘,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我狮暑,道長(zhǎng)鸡挠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任搬男,我火速辦了婚禮拣展,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缔逛。我一直安慰自己备埃,他們只是感情好姓惑,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著按脚,像睡著了一般于毙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辅搬,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天唯沮,我揣著相機(jī)與錄音,去河邊找鬼堪遂。 笑死介蛉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蚤氏。 我是一名探鬼主播甘耿,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼竿滨!你這毒婦竟也來(lái)了佳恬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤于游,失蹤者是張志新(化名)和其女友劉穎毁葱,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贰剥,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡倾剿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚌成。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片前痘。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖担忧,靈堂內(nèi)的尸體忽然破棺而出芹缔,到底是詐尸還是另有隱情,我是刑警寧澤瓶盛,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布最欠,位于F島的核電站,受9級(jí)特大地震影響惩猫,放射性物質(zhì)發(fā)生泄漏芝硬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一轧房、第九天 我趴在偏房一處隱蔽的房頂上張望拌阴。 院中可真熱鬧,春花似錦奶镶、人聲如沸皮官。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)捺氢。三九已至藻丢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間摄乒,已是汗流浹背悠反。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留馍佑,地道東北人斋否。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像拭荤,于是被迫代替她去往敵國(guó)和親茵臭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容