本筆記首發(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分析(源碼分析):
方程簡(jiǎn)要說(shuō)明:基于微觀表面和能量守恒等理論扣囊。
- diffuse 漫反射,通常假定表示為蘭伯特?cái)U(kuò)散項(xiàng)绒疗,是一個(gè)恒定不變的值侵歇。
- 右邊分?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。
整個(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è)(微觀表面法線方向分布)鏡面反射的高光只锻,高光形狀玖像。
引入并稱為Generalized-Trowbridge-Reitz捺僻,或者GTR乡洼。
參數(shù):
c 縮放系數(shù)(scaling constant)
α 粗糙度參數(shù)(roughness parameter俗稱感性粗糙度崇裁,roughness map)在0-1之間
θh 為ndh
γ 指數(shù)值
在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 ));
}
設(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)
三種粗糙分布模型:Kurt的經(jīng)驗(yàn)?zāi)P停〝?shù)據(jù)擬合)栓拜,沃爾特(Walter)的史密斯(Smith)G衍生品座泳,什里克(Schlick)的更簡(jiǎn)單的衍生品粗糙度作為自由參數(shù)
// 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é)