Disney BRDF Explorer 使用心得

前言

为了深入理解基于迪士尼BRDF的渲染流程,以及各个暴露给艺术家参数的意义,直接强撸代码和公式当然没问题,只是这样的理解往往非常片面和抽象,也无法形成感性认识,以后又怎么能与美术家们愉快的交流呢?我想这就是为什么迪士尼会开发这套BRDF Explorer工具的原因。它很好的将公式具象化成了各种图表,以便技术同学追踪细节,同时也提供了艺术家们可以直观感受的渲染预览视图,为技术和美术之间的沟通架起了可靠又高效的桥梁。鉴于目前我并没有找到完整的BRDF Explorer使用手册,也没有找到官方对各种视窗参数和坐标的定义和说明,我决定自己开这篇博文好好总结下这段时间来学习和使用这套工具的经验,一方面可以方便有需要的同学快速理解和上手工具,另一方面也希望有大牛能不吝赐教、指正。

BRDF Explorer

下载地址
注意下载的是源码,需要针对不同平台先编译成可执行文件,这方面网上资源和教程很多,此处就不再赘述了。

全貌
BRDF Explorer主视图

上图是开启工具,并导入BRDF文件后的显示状态。可以简单分为上方的菜单栏,左侧的状态信息,以及右侧上下共2个显示输出窗口。每个输出窗口都有若干条页签,下面我们一起来梳理下这些视窗的功能以及参数的含义。

Lit Sphere
Lit Sphere
  1. 基于所有开启且激活的BRDF文件,在3D空间中对一个球体进行实时渲染的输出。
  2. 可以认为固定了摄像机的位置;也固定了球体的位置;但是可以调节光源的位置。
  3. 勾选“Double theta”能够让高光中心完全跟随鼠标,既鼠标控制的是镜面反射的入射点。
  4. Gamma和Exp调节最终输出图像的亮度,一般很少会去条件这两项。
Polar Plot
Polar Plot
  1. 是球面坐标系的一个切片,描述由鼠标控制的高光中心点为中心的半球空域内的光能分布。
  2. 方位角等于跟随L,V所构成的平面与水平面交线的朝向,其他方位角上的信息不显示,因而是2D图像。
  3. 粉红射线:V,既视方向
  4. 蓝射线:l,既光线入射方向
  5. 绿色射线:N,物体表面的宏观法线
  6. 金色半圆:高光中心点周围的半球空域,既天顶角θ。
  7. 红色包络线:中心点沿半球180°各个方向上的出射光强(包含Diffuse和Specluar)
  8. 红色包络线上一点与中心点连线构成半径r,r的模长代表这个立体角方向上的出射光强。
Theta V
Theta V
  1. 横轴是视方向V和宏观法线N之间的夹角
  2. 图中右侧上扬曲线代表当V在掠射方向时,接收到的光能的变化(菲尼尔效应)。
  3. 图中左侧可以认为是掠射逆反射光强。
  4. 控制参数PhiV通常被锁定,控制方位角。
Theta D
Theta D
  1. 横轴表示V或L与半角矢量H的夹角;纵轴表示出射光强。
  2. 控制变量ThetaH表示半角矢量H与宏观法线N的夹角。
  3. 图中两端都是掠射方向。
  4. ThetaH拉满(90°)时,中间部分属于逆反射分量。
Theta H
Theta H
  1. 与 Theta D类似,互调了变量。
3D Plot
3D Plot
  1. 相较于只在一个方位角上输出的Polar Plot视图,3D Plot视图展示的是在全部方位角上的半球空域光强分布。
  2. 增加的红色射线指向X轴正方向。
  3. 增加的绿色射线指向Y轴正方向。
  4. 保持鼠标左键,拖拽鼠标可以旋转视角。
  5. 保持鼠标右键,拖拽鼠标可以缩放视角。
  6. 从3D空间的中心射出的任何一条指向半球空域的射线,只会和3D包络面有且只有一个交点,交点与中心点的连线模长正比于该立体角方向的出射光亮度。
Image Slice
Image Slice
  1. 迪士尼推荐的另一种快速观察BRDF渲染效果的方案,具体如何读图可以参考官方技术文档(2012版)。
  2. Square ThetaH、Show Chroma 不建议点选,保持图像数据和表现的一致性、连贯性。
  3. PhiD代表方位角,一般使用90度时的切片即可。
  4. Gamma、Exposure保持默认即可,理由同(2)。
BRDF Parameters
BRDF Parameters
  1. 上部下拉列表用于控制显示通道(光强、R、G和B),作用在Plot窗口中出射光强度上。
  2. Log plot勾选可以缩小Plot窗口中图像的尺寸(缩放出射光强度数值),消减因幂律函数带来的一些峰值过曝的显示问题。
  3. Multiplay by N.L:作用同上,机制不明。
  4. Incident angle包含天顶角thetaL和方位角PhiL,反应当前渲染图中的高光点位置。
Open BRDF
Open BRDF
  1. 主视窗左上角File -> Open BRDF。
  2. 用来导入BRDF脚本,脚本遵循GLSL语法,可以自定义。
BRDF
BRDF
  1. 打开BRDF文件后显示本窗口。
  2. Visible勾选既显示当前BRDF图像。
  3. 支持同时多开BRDF文件,同时勾选Visible则显示全部BRDF的输出图像(叠加输出到同一个视窗中)。
  4. 箭头处白色圆点代表solo BRDF,既只显示当前BRDF,隐去其余。
  5. solo BRDF旁边的是solo BRDF Channel,点选则只显示当前BRDF的某个Channel,默认为红色。
  6. 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
  1. BRDF文件由一些列参数以及用GLSL语言写的BRDF函数构成。
  2. 函数代码段需要被"::begin shader" 和"::end shader" 包裹住。
  3. 参数支持float,bool和color类型。
  4. float 需要满足如下形式:
    float [name] [min] [max] [default val]
  5. bool类型无需min和max设置,只需定义 [default val]即可。
  6. color类型同样无需min和max,但需要3个通道的 [default val]。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容