前言
为了深入理解基于迪士尼BRDF的渲染流程,以及各个暴露给艺术家参数的意义,直接强撸代码和公式当然没问题,只是这样的理解往往非常片面和抽象,也无法形成感性认识,以后又怎么能与美术家们愉快的交流呢?我想这就是为什么迪士尼会开发这套BRDF Explorer工具的原因。它很好的将公式具象化成了各种图表,以便技术同学追踪细节,同时也提供了艺术家们可以直观感受的渲染预览视图,为技术和美术之间的沟通架起了可靠又高效的桥梁。鉴于目前我并没有找到完整的BRDF Explorer使用手册,也没有找到官方对各种视窗参数和坐标的定义和说明,我决定自己开这篇博文好好总结下这段时间来学习和使用这套工具的经验,一方面可以方便有需要的同学快速理解和上手工具,另一方面也希望有大牛能不吝赐教、指正。
BRDF Explorer
下载地址
注意下载的是源码,需要针对不同平台先编译成可执行文件,这方面网上资源和教程很多,此处就不再赘述了。
全貌
上图是开启工具,并导入BRDF文件后的显示状态。可以简单分为上方的菜单栏,左侧的状态信息,以及右侧上下共2个显示输出窗口。每个输出窗口都有若干条页签,下面我们一起来梳理下这些视窗的功能以及参数的含义。
Lit Sphere
- 基于所有开启且激活的BRDF文件,在3D空间中对一个球体进行实时渲染的输出。
- 可以认为固定了摄像机的位置;也固定了球体的位置;但是可以调节光源的位置。
- 勾选“Double theta”能够让高光中心完全跟随鼠标,既鼠标控制的是镜面反射的入射点。
- Gamma和Exp调节最终输出图像的亮度,一般很少会去条件这两项。
Polar Plot
- 是球面坐标系的一个切片,描述由鼠标控制的高光中心点为中心的半球空域内的光能分布。
- 方位角等于跟随L,V所构成的平面与水平面交线的朝向,其他方位角上的信息不显示,因而是2D图像。
- 粉红射线:V,既视方向
- 蓝射线:l,既光线入射方向
- 绿色射线:N,物体表面的宏观法线
- 金色半圆:高光中心点周围的半球空域,既天顶角θ。
- 红色包络线:中心点沿半球180°各个方向上的出射光强(包含Diffuse和Specluar)
- 红色包络线上一点与中心点连线构成半径r,r的模长代表这个立体角方向上的出射光强。
Theta V
- 横轴是视方向V和宏观法线N之间的夹角
- 图中右侧上扬曲线代表当V在掠射方向时,接收到的光能的变化(菲尼尔效应)。
- 图中左侧可以认为是掠射逆反射光强。
- 控制参数PhiV通常被锁定,控制方位角。
Theta D
- 横轴表示V或L与半角矢量H的夹角;纵轴表示出射光强。
- 控制变量ThetaH表示半角矢量H与宏观法线N的夹角。
- 图中两端都是掠射方向。
- ThetaH拉满(90°)时,中间部分属于逆反射分量。
Theta H
- 与 Theta D类似,互调了变量。
3D Plot
- 相较于只在一个方位角上输出的Polar Plot视图,3D Plot视图展示的是在全部方位角上的半球空域光强分布。
- 增加的红色射线指向X轴正方向。
- 增加的绿色射线指向Y轴正方向。
- 保持鼠标左键,拖拽鼠标可以旋转视角。
- 保持鼠标右键,拖拽鼠标可以缩放视角。
- 从3D空间的中心射出的任何一条指向半球空域的射线,只会和3D包络面有且只有一个交点,交点与中心点的连线模长正比于该立体角方向的出射光亮度。
Image Slice
- 迪士尼推荐的另一种快速观察BRDF渲染效果的方案,具体如何读图可以参考官方技术文档(2012版)。
- Square ThetaH、Show Chroma 不建议点选,保持图像数据和表现的一致性、连贯性。
- PhiD代表方位角,一般使用90度时的切片即可。
- Gamma、Exposure保持默认即可,理由同(2)。
BRDF Parameters
- 上部下拉列表用于控制显示通道(光强、R、G和B),作用在Plot窗口中出射光强度上。
- Log plot勾选可以缩小Plot窗口中图像的尺寸(缩放出射光强度数值),消减因幂律函数带来的一些峰值过曝的显示问题。
- Multiplay by N.L:作用同上,机制不明。
- Incident angle包含天顶角thetaL和方位角PhiL,反应当前渲染图中的高光点位置。
Open BRDF
- 主视窗左上角File -> Open BRDF。
- 用来导入BRDF脚本,脚本遵循GLSL语法,可以自定义。
BRDF
- 打开BRDF文件后显示本窗口。
- Visible勾选既显示当前BRDF图像。
- 支持同时多开BRDF文件,同时勾选Visible则显示全部BRDF的输出图像(叠加输出到同一个视窗中)。
- 箭头处白色圆点代表solo BRDF,既只显示当前BRDF,隐去其余。
- solo BRDF旁边的是solo BRDF Channel,点选则只显示当前BRDF的某个Channel,默认为红色。
- baseColor及以下全部为当前打开的BRDF文件自定义的可控变量。这部分会另起文章详细叙述。
BRDF File
analytic
::begin parameters
float m 0.001 .3 .1
float f0 0 1 .1
bool include_F 1
bool include_G 1
::end parameters
::begin shader
float sqr(float x) { return x*x; }
float Beckmann(float m, float t)
{
float M = m*m;
float T = t*t;
return exp((T-1)/(M*T)) / (M*T*T);
}
float Fresnel(float f0, float u)
{
// from Schlick
return f0 + (1-f0) * pow(1-u, 5);
}
vec3 BRDF( vec3 L, vec3 V, vec3 N, vec3 X, vec3 Y )
{
// compute the half vec3
vec3 H = normalize( L + V );
float NdotH = dot(N, H);
float VdotH = dot(V, H);
float NdotL = dot(N, L);
float NdotV = dot(N, V);
float oneOverNdotV = 1.0 / NdotV;
float D = Beckmann(m, NdotH);
float F = Fresnel(f0, VdotH);
NdotH = NdotH + NdotH;
float G = (NdotV < NdotL) ?
((NdotV*NdotH < VdotH) ?
NdotH / VdotH :
oneOverNdotV)
:
((NdotL*NdotH < VdotH) ?
NdotH*NdotL / (VdotH*NdotV) :
oneOverNdotV);
if (include_G) G = oneOverNdotV;
float val = NdotH < 0 ? 0.0 : D * G ;
if (include_F) val *= F;
val = val / NdotL;
return vec3(val);
}
::end shader
- BRDF文件由一些列参数以及用GLSL语言写的BRDF函数构成。
- 函数代码段需要被"::begin shader" 和"::end shader" 包裹住。
- 参数支持float,bool和color类型。
- float 需要满足如下形式:
float [name] [min] [max] [default val] - bool类型无需min和max设置,只需定义 [default val]即可。
- color类型同样无需min和max,但需要3个通道的 [default val]。