PBR眼睛渲染
要想达到真实的眼睛渲染效果,就要先了解人体眼睛的结构,特性。然后着重渲染结构的外在表现点。
1.眼睛的结构以及主要表现点
- 巩膜(Sclera),是眼睛白色的部分,也被称为“眼白”,这个区域通常非常潮湿,并且有少量的触觉纹理。
- 虹膜(Iris),是彩色鸾尾花状部分,是眼睛中心周围的色环。虹膜是一圈类似肌肉的纤维,可以扩张和收缩,让更多的光线进入或关闭瞳孔。
- 瞳孔(Pupil),则是虹膜里面的黑色部分。它是光线通过的孔,光线随后进入晶状体,再经过晶状体屈光作用后到达视网膜。
- **角膜缘(Limbus)**是存在于虹膜和巩膜之间的暗环。它在某些眼睛中比其他眼睛更占主导地位,并且从侧面观看时会逐渐消失。
- 角膜(Cornea),是位于虹膜上方一层的透明圆顶层。角膜和虹膜之间充满液体(房水),这也是导致虹膜有折射现象的原因。
2.制作方案
- Sclera-可以调整巩膜区域大小以及质感
- Iris / Cornea-角膜Cornea和虹膜Iris,从模型角度来看这两部分是重叠的。本方案在shader计算出Iris/Cornea的Mask区域,可以灵活调整角膜虹膜的半径
- Limbus-也是在Shader中计算所得,并且暗环从侧面观察时会逐渐消失
- Pupil-可以自由调整瞳孔大小
3.渲染特性
-
View Refraction
有两种方法:一:视差映射。二:基于物理方法计算折射,这里采用基于物理的方法计算折射,这种方法相对于视差映射来说效果更好一点。
1/眼球朝向EyeDirection
2/屈光体的高度(深度)以及折射率IOR
3/计算出光线的折射方向,然后转化为UV的偏移量 -
Reflections
注意角膜Cornea和巩膜Sclera的反射是有区别的(光滑度和法线)
-
Light Refraction
角膜与虹膜之间有一层充满液体的东西,会产生光线的折射,并且引起焦散效果Caustic -
Ambient Occlusion
4.实现过程要点
1.巩膜和虹膜两张贴图的混合
/首先计算出一张Mask用来混合巩膜和虹膜,计算过程如下:
/首先眼球模型的uv展开是一个圆心坐标为(0.5,0.5)的圆,这个计算过程是获取模型uv坐标,计算该点uv坐标和中心uv的距离,减去虹膜半径,然后将这个值除以一个很小的数再进行反转,反转为了得到正确的Mask范围,最后用smoothstep函数进行0-1的映射,得到一个Mask结果。
/之后利用这个计算出的Mask结果对巩膜和虹膜进行插值混合,得到一个基础的眼球效果。
2.View Refraction(视线折射)
/如前面渲染特性的分析所说,我们要实现角膜和房水之后的虹膜的视线折射效果,就要先获得几个信息,眼球的朝向,角膜到虹膜的深度(高度),房水以及空气的折射率IOR,从而计算出视线的折射方向,最后用视线折射方向对虹膜贴图采样UV进行偏移,实现虹膜的折射效果。
/首先来计算虹膜深度(IrisDepth),这里使用的计算方法是用一张HDR信息的贴图,记录了模型上的点到中间面片的深度。对这张帖图采样两次,第一次正常采样,第二次采样虚拟虹膜位置到中间面片的深度,二者相减,即得角膜到虚拟虹膜的深度。详细计算过程:
/然后要获得眼球的朝向,这里采用烘培一张法线贴图的方法来得到。
/最后就是用EyeRefraction函数返回的uv值去采样虹膜纹理,得到最终的模拟视线方向虹膜折射效果。
/而对于上面所说到的EyeRefraction函数则是对从视线入射到折射,再到到达虹膜,产生uv偏移这样一个计算过程的封装,它的参数就是我们上面获得的信息。
3.角膜缘(Limbus)
角膜缘的实现和上面计算虹膜遮罩很类似,同样是计算一层遮罩,然后通过这层遮罩实现黑色边缘和虹膜的混合,然后再将混合结果通过上面计算的虹膜遮罩和巩膜混合,这样就基本实现了眼睛的基本结构基础色。
4.光照计算(光照函数的参数输入)
/上面的步骤实现了眼球的不同部位BaseColor的混合,以及虹膜的视线折射,这一部分将作为BaseColor部分输入光照主函数。
/SpecularColor,Roughness,SurfaceNormal,
/CausticNormal焦散法线,用来模拟光线折射下的虹膜焦散效果。
/IrisNormal虹膜法线,用来模拟,虹膜表面凹凸不平的质感。