【插播002】Subsurface
综述:
次表面散射(SSS)模拟光线进入对象并在其表面下散射的效果。并非所有的光线都从被照明对象表面散射,其中一部分会穿透表面并被材质吸收、散射在照明对象内部。这些在材质内部散射的光线中,还会有一部分会再次回到被照明对象表面,并被摄像机捕捉、变得可见。这个过程被称为次表面散射或SSS。SSS对于大理石、皮肤、树叶、蜡、牛奶等材质的真实再现是必不可少的。该着色器中的SSS组件使用蛮力光线追踪算法(暴力算法,穷举法)进行计算。
当渲染像堆叠的塑料这种材质时,SSS显得尤为重要,例如:
各项参数详解:
Subsurface参数【Weight】控制漫反射和次表面散射之间的“混合”(次表面散射的强度)。当设置为1.0时,只有SSS,当设置为0时,没有任何SSS。 在大多数情况下,使用1.0(完全SSS)。
通常,提高权重值,颜色会变得更通透:
【Color】用于确定次表面散射效果的颜色。 例如,皮肤材质意味着将其设置为肉色。
皮肤着色器设置举例Tips:
Skin Color
通常,将皮肤颜色纹理贴图链接到次表面颜色,并将次表面颜色的半径设置为适合皮肤的值(假设红色主要来自血液,大多数情况下红色通道值越高,皮肤呈现颜色越红)。如果需要的话,半径也可以被纹理化。静脉是颜色纹理贴图的一部分,不仅影响皮肤颜色,而且还影响次表面散射在皮肤上的表现。
标准曲面混合了Base和SSS,你可以自己选择是否在皮肤上使用漫反射。这种混合可以用于多种情况,例如混合不同材质的面具或者面部彩绘,或通过将相同的材质连接到 Base Color 和 Subsurface Color并更改混合条件来改变清晰度。
皮肤着色器参数设置参考
【Radius】光线在表面下可以穿透的深度,也称为“平均自由程”(MFP)。这个参数(Radius)影响散射光线在返回表面之前,在表面之下传播的平均距离。可以为每个色彩成分(r,g,b)分别指定不同半径值。Radius的值越高模型的透光性越强,值越低外观透明度越低。
颜色越浅,散射的光越多。 值为0将不会产生散射效果:
增加Radius的值可以改变材质的外观,使其起来从像皮革到像大理石。 SSS非常依赖数值范围, 需要根据模型的大小调整Radius。 如果要使用默认的SSS设置进行渲染,则可能会产生某些不正确的外观。 当然另一种选择是,调整场景数值,也可以得到类似的结果。
可以为每种RGB颜色选择不同的Radius值,而不是分配相同数值给所有颜色。 例如,粘土或皮肤等材料的Radius值,红色应高于绿色和蓝色。
Tips:
渲染皮肤时,应使用像1.0,0.35,0.2等值,表示红色应该分散最深,绿色和蓝色其次。 这将取代皮肤的三层工作流程(深层,中层和浅层),使深层显示为红色,表明深层应以更大的半径散射,即scatter_radius.R设置为更大的值。
下图显示了增加红色的Radius值时的效果。 注意圆周边的彩色“边缘”的效果。 将合成包中源图像的红色通道进行高斯模糊,会出现同样的效果。
【Scale】控制光线在反射回去之前,可能在表面之下传播的距离。 它可以缩放散射半径,调节颜色的SSS半径。
如果场景以米为单位,则可以将SSS比例设置为0.01,以厘米为单位指定SSS半径。 例如对于皮肤,SSS半径可以是0.37cm,0.14cm,0.07cm。
**【Type】可以选择diffusion或者randomwalk两种类型(默认情况下使用diffusion,以免打破现有场景外观)。
- 与基于扩散理论的BSSRDF(Bidirectional Surface Scattering Reflectance Distribution Function)方法不同,randomwalk实际上是记录表面之下光线的随机游走踪迹,并且没有假设几何存在局部平坦。这意味着randomwalk可以顾及像蛮力体积渲染(BF算法,暴力算法,穷举法)那样的各向异性散射,并且能够在凹面和小细节周围产生更好的结果。
- 对于较大的散射半径(即平均自由程大的介质)而言,randomwalk的渲染效率远远大于diffusion。另一方面,在重介质(即平均自由程小的介质。重介质指密度大于1g/cm3的介质,包括重悬浮液和重液)中,randomwalk可能较慢,并且不支持用于将两个表面混合在一起的sss_setname,可能需要重新使用别的材质以实现类似的外观。randomwalk对非闭合网格更敏感,例如“嘴、袋子”等几何内部也会投射阴影。
有关BSSRDF请移步:局部光照模型杂记
【Anisotropy】Henyey-Greenstein(HG函数)在-1(完全后向散射)和1(完全前向散射)之间的各向异性系数。 对于各向同性介质,其默认值为0,从而在各个方向均匀地散射光线,以获得均匀的光照效果(例如镜面)。 正值偏向光线散射前方,负值偏向光线散射后方。
这个参数只适用于randomwalk SSS模式。
【SSS Between Objects】可以将多个对象标记为属于同一个SSS“集合”,以便照明在对象边界上模糊。 一个常见的用例是牙齿和牙龈之间的模糊。 它通过将常量STRING userdata sss_setname给集合中对象赋予相同值来启用。
目前这种方法与randomwalk SSS不兼容。
禁止私自转载。
转载请私信。