外观就是材质,就是BRDF,然后对于不同的模型,这个材质的计算不太一样
目录
非表面模型
参与介质
头发
皮毛-动物毛发
颗粒材质(Granular material)
表面模型
半透明材质(Translucent material) BSSRDF
布料
Detailed material (non-statistical BRDF)
过程中程序生成外观(Procedural appearance)
参与介质或者说散射介质,是指光线穿过这个介质时会被吸收和被散射,像这个云、雾、烟……
用一个函数,Phase Function,这个相位函数来描述参与介质散射光的性质,是往后集中散射、往前集中散射还是各向同性散射
这个光线在参与介质里面走得越远就说明参与介质吸收光线的能力越强,怎么来渲染呢,还是用光线追踪的方法,让光线在里面弹射,然后相连各个弹射点,计算总路径的贡献
Kajiya-Kay模型把头发当作一个圆柱体,然后光线照射到头发上会形成这么一个圆锥形的散射
但是Kajiya-Kay模型的效果不是特别好
然后是Marschner模型,将散射的光线分成三种,R光线是一次反射,TT光线是从一个表面折射进去然后从另一个表面折射出来,TRT光线是先折射进去,在头发内部反射一次后折射出来
这个Marschner模型把头发当成玻璃的圆柱体,分成角质层(cuticle)和皮层(cortex),皮层含有色素会吸收光线,考虑三种光线和这个圆柱体的作用
效果很好
这个动物的毛发如果直接用人的头发模型来做的话是左图的效果,右图是用动物皮毛模型的,这也是闫神做的模型(太厉害了)
结构决定性质,这肯定是因为动物的皮毛和我们的头发结构不一样所导致的,大家都有这个外面的角质层,里面吸收光的皮层,还有中间散射光的髓质,不一样的是我们人类的髓质比较小,而动物的髓质比较大
这个髓质大的话,毛发透光会更多
于是就有人(闫神)就提出了这个双层的圆柱模型,加入了髓质部分
光线在原来的R、TT、TRT的基础上增加了散射穿过的TTS和散射反射出来的TRTS
效果是这样的
有一些物体它是这个颗粒状的,这个计算量就非常大
但是可以做一些简化,比如把这个物体分成一些小单元,然后根据这个单元里面包含的颗粒材质的比例来计算整体
这个半透明材质指的是光线从物体表面某个点进去但是经过里面的反射后从物体表面另外的点射出来的材质,叫做次表面散射(Subsurface Scattering),像这个玉石、水母、牛奶,就是光照过去就会晶莹剔透的感觉,
这个性质可以在之前的BRDF上拓展成BSSRDF,这个SS指的是Subsurface Scattering,之前的BRDF只反映的从哪个方向来往哪个方向去,这里还需要加上从哪个点来往哪个点去
相应的渲染方程也要进行修改,因为从这个点冒出来的光不知道是来着哪个点的,所以还需要对所有的方向和面积进行积分
次表面散射的效果很像有一个光源在物体内部发光的效果,然后为了物理上的真实,人们推出只有底下这么个光源不够,还得有上面对称的一个光源,然后用这两个光源渲染的效果就很像次表面散射的效果,这个方法就叫Dipole Approximation
然后人的皮肤也是类似的这样的透光材质,就可以用这个BSSRDF生成虚拟人物,非常逼真
先来说一下这个布料的结构,由纤维缠绕成股,就是这个Ply,然后由股缠绕成线,就这个Yarn
有了线之后就可以通过编织得到布料
对于这个布料有三种渲染方式
一个是根据这个布料的编织方式去定义好一个BRDF,当成表面来渲染
但是当成表面来渲染对于那些表面本身不像平面的布料像天鹅绒就不太好,所以有这种把它当成参与介质,把布料当成体积进行渲染,用很多细细块去切分纤维,根据里面纤维的分布和朝向计算整个块的性质,当成参与介质,像这个云烟雾来渲染
最后一种方法就是直接渲染每根纤维,暴力解决
我们渲染出来的东西太完美了看起来反而不真实
因为在真实的世界中东西本身是不完美的,或许因为做工或许是因为磨损或许是因为完美本身就不存在
用这个微表面模型来说,最重要的是这个描述法线分布的D,之前用的都是简单的分布,像这个正太分布,都是连续函数
但是在真实世界中的样本分布它总是不连续的,会有很多的这种噪声存在,这才是真实的世界
但是这个渲染起来很难,为什么难呢,微表面模型中我们把每个微小表面都当成镜面反射,从摄像机打出光线到微表面上再反射出去,但是很难碰到光源
那怎么办呢,我就从一个像素出发把它覆盖到的一片微表面区域去计算出统一的一个法线出来再计算,唉但是这个解决办法和我刚刚遇到的打不到光源的问题有什么关系,好像没解决啊?闫神怎么不多解释一下T_T
由于这个光具有波粒二象性,当光遇到的物体尺寸大小和光的波长接近的时候就会发生波的现象,因此这个波动性也需要考虑
这个和之前学的纹理应用中的程序纹理差不多,就是我不用事先存储整个物体的材质,而是要用的时候去动态查询,通过一个噪声函数,传入物体三维的位置得到一个值来用