siggraph10, physically based shading course的开场,naty hoffman带来,link:
http://renderwonk.com/publications/s2010-shading-course/hoffman/s2010_physically_based_shading_hoffman_a.pdf
http://renderwonk.com/publications/s2010-shading-course/hoffman/s2010_physically_based_shading_hoffman_a_notes.pdf
非常棒的一个基础知识讲解。
开始是很多的光物理上的讲解,中学物理基础会帮上很多忙,
*refactive index
**这是一个复数,实部表示介质如何去影响光速的(这个越大,折射率越高),虚部表示光被吸收的程度(这个越大就越不透明)
*散射(scattering)
**如果介质的refractive index逐渐改变的,那么光就会走出一个弧线,如果短距离内大幅度改变,光就会散射
一些定义:
- radiance:一条射线上的光强
- BRDF:
- bidirectional reflectance distribution function
- 定义了一个surface对光照会有如何的反应
- 它的参数是light and view direction
- 两个角度,所以是一个4d空间的函数
- 如果绕着normal旋转lightdir或者viewdir,brdf改变了,那么这个叫做各向异性brdf
- 如果绕normal转lightdir,brdf不变,那么这个就是各向同性brdf,这种情况下,可以用3个参数来表示
- brdf可以以两种方式来表述
- 给定一个从某个方向射入的光,给出在surface上在所有方向的反射和散射分布
- 反过来,给定view dir,看light的contribution:光是可逆的么
- brdf一般用在反射公式中:
- 这里表达一个含义是出射的radiance等于"入射的radiance"*brdf*dot(n,l)
- brdf有两个基本属性
- 可逆的
- 能量守恒:一个平面不能反射多于入射光的能量,也就是要满足这样的公式:
- brdf包含了2个截然不同的现象
- surface reflection
- 一般叫specular
- subsurface scattering
- 一般叫diffuse
- Specular: 一般使用microfacet theory来做抽象描述,这个是大多数physically based specular brdf部分的基础
- 是把平面看成有无数个微平面组成的
- 公式:
- F:fresnel part, G:微面部分的比例,D:normal distribution, l:light dir, h:microfacet normal,v:view dir
- 这里就结合今天参考call of duty black ops的ppt实现的进一步认识说一下吧
- fresnel:
- 初中物理了,这里比较重要的是schlick approximation大大简化了计算:
- 这里一些比较有意思的表,比如金属没有diffuse部分
- 另外在microfacet框架下,需要把n换成h,因为microfacet下能看见的肯定都是通过某些小平面射过来的,这部分不能用n,也就是说,给定light dir和view dir,全场景的fresnel是定的,和每个面的normal是无关的(这里需要结合microfacet里面进一步想一下,这个在call of duty black ops的ppt里面也有说)。
- 因为和normal无关,所以即便直接不用了fresnel参数也是ok的
- normal distribution
- 有一些参数类似roughness等
- 决定了specular的大小和形状
- 他可以说是很多specular的主体,典型的一个是blinn phong模型:pow(dot(normal, halfDir), specPower)*(specPower+2)/2*Pi;\
- 和phong模型(pow(dot(normal, halfDir), specPower)比较像,多了一个和specPower几乎成正比的额外参数,blin phong比phong要更加正确。
- G(l,v,h)叫做brdf的“geometry term”, 是指没有被遮挡的部分(也就是能反射光的部分)
- shadow masking部分本质上是为了能量守恒来做的
- 表达了一个microfacet被light和view看见的几率,所以dot(normal, lightDir)和dot(normal,viewDir)是必有的两个参数
- 一些模型就是直接nDotL*nDotV,也有max(nDotL, nDotV)
- cod_bo使用的是smith approximation, 参数上带specPower的
- 它也会对specular的分布造成进一步的影响(废话么)
- 矫正项:
- 加一个1/(4*dot(n,l)*dot(n,v))来做一个矫正,
- brdf里面很多部分是彼此independent的,所以可以根据自己需要去选择适合自己的function
- Diffuse
- 目前为止最常用的模型是lambert,直接就是一个常量diffuse color
- 我们一般算diffuse lighting是nDotL*diffuseColor,这里的nDotL是reflection function里的不是diffuseColor的,BRDF中的diffuse使用lambert的话就只有一个常量