Uncategorized

🕹️OpenGL丨眼部渲染 - 皮肤渲染(7)

by ERIN.Z, 2023-03-07


阶段性成果: Snipaste_2023-03-09_10-30-02.jpg Todo:

  • Precomputed Light Refraction
  • SSR
  • Sclera Wrap
  • Redness Shading

置入渲染素材

在先前的渲染框架上,我们将眼球与睫毛的模型导入,分配Shader,并于MASS的PBR pass时绘制。我为皮肤以外的元素创建了一组新的帧缓冲(temp_other_ms&temp_other),以便在SSSS的最后与后处理后的皮肤组合。 Snipaste_2023-03-07_16-35-18.jpg

有个别实现细节在这里记录一下:

  • 眼球渲染
    • 素材包中分别提供了虹膜(iris)和巩膜(sclera)两张贴图。在引入眼部折射前,我们先暂时利用一个mask来将二者组合。

Snipaste_2023-03-07_17-06-10.jpg

  • 睫毛渲染
    • 睫毛的原始obj文件中分了三层睫毛,使用时在maya中进行了一次排序后重新导出,可以暂时避免半透明排序的问题。不过这个素材的贴图清晰度不够高,非特写视角就会糊成一团....想实现暴雪的效果可能需要改成分组插片的毛发面片(后续暂时换成扭曲毛流了(?) Snipaste_2023-03-07_20-33-31.jpg Snipaste_2023-03-07_16-23-02.jpg

环境光反射

之前的单光源渲染遇到高反射率的表面就显得过于单薄了,环境光反射可以为眼部渲染的真实性带来巨大的提升! 对比看看: Snipaste_2023-03-07_20-25-44.jpg 为模拟眼皮和睫毛对于反射的遮挡,引入一个Occlusion Mask来控制高光的范围: Snipaste_2023-03-07_21-50-51.jpg

眼角湿度

眼部的水分填充了眼球和眼眶模型的间隙,通过摄像观察,巩膜上水分的不均匀分布会影响高光的边缘形状,且在眼眶交接处由于堆积而形成线形高光。

首先是巩膜的反射,暴雪引入了一张法线噪波来控制表面的微小起浮。 Snipaste_2023-03-16_10-58-43.jpg

然后是眼眶堆积的水分,暴雪建立了三个状态的模型,使用BlendShape来控制中间状态。 Snipaste_2023-03-16_11-03-48.jpg Snipaste_2023-03-16_11-05-52.jpg

应用效果如图: wetness.png

基于物理的视线折射

让我们回到眼球的结构,可以发现,眼球在虹膜和角膜中间存在着一个“前房”的腔体,内部充满了房水,当视线穿过前房时就会发生折射。我们可以使用视差贴图来实现这种效果,但基于物理的折射的效果会更好一些。 眼球结构

基于物理的折射的前提条件是眼球的模型相对准确,前房的区域会沿眼轴突出。或者也可以引入一张贴图来记录前房的突出程度heightSnipaste_2023-03-16_11-14-04.jpg

Snipaste_2023-03-16_11-15-46.jpg 折射向量可以使用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;

应用效果如下: Snipaste_2023-03-16_11-18-21.jpg

角膜缘环

边缘环是虹膜结构的渐变区域,可以通过S形曲线插值虹膜和巩膜来获取这个柔和的渐变边缘(巧了 本能就用的smoothstep)。 Snipaste_2023-03-16_11-28-28.jpg 从正面观察时,真人眼部的边缘环颜色会比虹膜更深,但这一特性从侧面观察就变得没那么明显。显然我们现在的模型还没有这样的光照效果,这是因为在上一步中我们只模拟了光线从虹膜->房水->相机的这部分折射,光线入射时的折射还没有模拟出来。 Snipaste_2023-03-16_11-29-17.jpg Snipaste_2023-03-16_11-32-00.jpg

by ERIN.Z

2024 © typecho & elise