- Precomputed Light Refraction
- SSR
- Sclera Wrap
- Redness Shading
置入渲染素材
在先前的渲染框架上,我们将眼球与睫毛的模型导入,分配Shader,并于MASS的PBR pass时绘制。我为皮肤以外的元素创建了一组新的帧缓冲(temp_other_ms
&temp_other
),以便在SSSS的最后与后处理后的皮肤组合。
有个别实现细节在这里记录一下:
- 眼球渲染
- 素材包中分别提供了虹膜(iris)和巩膜(sclera)两张贴图。在引入眼部折射前,我们先暂时利用一个mask来将二者组合。
- 睫毛渲染
环境光反射
之前的单光源渲染遇到高反射率的表面就显得过于单薄了,环境光反射可以为眼部渲染的真实性带来巨大的提升! 对比看看: 为模拟眼皮和睫毛对于反射的遮挡,引入一个Occlusion Mask来控制高光的范围:
眼角湿度
眼部的水分填充了眼球和眼眶模型的间隙,通过摄像观察,巩膜上水分的不均匀分布会影响高光的边缘形状,且在眼眶交接处由于堆积而形成线形高光。
首先是巩膜的反射,暴雪引入了一张法线噪波来控制表面的微小起浮。
然后是眼眶堆积的水分,暴雪建立了三个状态的模型,使用BlendShape来控制中间状态。
基于物理的视线折射
让我们回到眼球的结构,可以发现,眼球在虹膜和角膜中间存在着一个“前房”的腔体,内部充满了房水,当视线穿过前房时就会发生折射。我们可以使用视差贴图来实现这种效果,但基于物理的折射的效果会更好一些。
基于物理的折射的前提条件是眼球的模型相对准确,前房的区域会沿眼轴突出。或者也可以引入一张贴图来记录前房的突出程度height
。
折射向量可以使用Real-Time Rendering book (Section 9.5. Refractions)的公式计算:
float w = ior * dot( normalW, viewW );
float k = sqrt( 1.0 + ( w - ior ) * ( w + ior ) );
float3 refractedW = ( w - k ) * normalW - ior * viewW;
角膜缘环
边缘环是虹膜结构的渐变区域,可以通过S形曲线插值虹膜和巩膜来获取这个柔和的渐变边缘(巧了 本能就用的smoothstep)。 从正面观察时,真人眼部的边缘环颜色会比虹膜更深,但这一特性从侧面观察就变得没那么明显。显然我们现在的模型还没有这样的光照效果,这是因为在上一步中我们只模拟了光线从虹膜->房水->相机的这部分折射,光线入射时的折射还没有模拟出来。