unity 皮肤材质效果实现分析
Posted 暮志未晚Webgl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity 皮肤材质效果实现分析相关的知识,希望对你有一定的参考价值。
相关资料
https://therealmjp.github.io/posts/sss-intro/
里面讲解了次表明散射的概念原理,以及发展过程。到了实时渲染,早期的基于纹理空间的扩散,到现在经常会应用于移动端的预积分的次表明散射(就是有一张图的表,从上面取色,还需要一个曲率的东西去控制),然后就是屏幕空间的次表明散射(为了生成更好的曲率)。
https://www.iryoku.com/stare-into-the-future
讲解了如何渲染真实的皮肤效果
要说皮肤渲染,还是得看ue4,接下来看一下ue的相关
https://docs.unrealengine.com/4.27/en-US/RenderingAndGraphics/Materials/HowTo/Human_Skin/
这个是直接告诉你了怎么在ue里面实现皮肤材质
https://docs.unrealengine.com/4.26/en-US/Resources/Showcases/PhotorealisticCharacter/
https://docs.unrealengine.com/4.26/en-US/Resources/Showcases/DigitalHumans/
https://texturing.xyz/pages/saurabh-jethani-creating-realistic-skin-in-ue4
渲染特性
次表面散射
我们正常渲染pbr物理材质brdf,只是做了表面效果,表面漫反射,表面高光。次表面散射就是光线进入物体内部,在物体内部进行反射后,又反射出来,带有一定内部的颜色的效果。
第一种方法是,基于屏幕空间的次表明散射(sssss),这种效果也是在ue里面使用到。原理就是不模拟物理上的真实的散射,而是根据当前位置和光线入射点的位置去计算出一个差不多的效果。这种效果需要一个Diffusion Profiles(扩散配置文件)来描述次表面散射行为中光线与散射距离的关系。
扩散配置纹理里面会配置滤波器的总宽度(散射范围),每个颜色的衰减,以及进入到皮肤内的光线的多少(越年轻的可以调的越大)。然后在屏幕空间中获取深度,采集周围的像素深度计算出曲率,来设置效果渐变。如果曲率越大,散射效果越弱。
第二种方法就是使用预先积分的次表明散射,和屏幕次表明散射的区别在于,不使用Diffusion Profiles(扩散配置文件)而是修改为使用一张LUT贴图来描述当前的散射效果。图如下,
通过法向和光线的点积确定横向坐标位置,通过曲率确定纵向。曲率可以通过软件烘焙出来,比如Knald,或者直接在shader中计算得出一个曲率。如果达到一个好的效果,推荐直接使用屏幕空间深度计算来获取,虽然耗性能,大家还是根据效果和性能折中即可。
为了达到质感柔和的效果,我们需要通过使用不同模糊的法线贴图,来进一步模拟Diffusion Profiles(扩散配置文件)。
高光的法向贴图就是默认贴图,红色透性最强,所以,它的贴图的模糊也最高,蓝色的最小,模糊度也最低,(红色的可以通过mip层级获取,蓝色和绿色可以通过红色和默认的lerp操作获取)然后我们把这些法向贴图获取到的高光进行融合,获取到一个更加不错的效果。
高光
双层高光进行混合,增加皮肤质感,第一层主要控制,占85%,第二层次要,占15%。它们也要给予能量守恒。
高光颜色强度 F0 (在ue里面有这个接口,值默认是0.5)默认是通用的0.04,皮肤的需要设置成 0.35,对应高光的起始值就是 0.028 。
细节贴图
细节贴图要实现皮肤的细节,就是有毛孔的效果的皮肤,然后和默认的法向贴图融合,实现一个细节的模拟。
粗糙度
粗糙度建议从0.4开始调整。贴图建议不用表现太多细节,只用来划定区域,值低的范围的就是光滑度高,值高的地方,就混合细节贴图高一些,也显得皮肤更加真实。
CavityMap
用来表现皮肤微观细节的ao信息,这个主要用来表现高光部分细节,在高量的部分展现更多的细节。所以,可以用来控制高光反射强度。
AO
环境光遮蔽,首先就是烘焙的贴图,然后需要屏幕空间ao,混合得出。
涂层 ClearCoat
用来实现脸部化妆的效果。腮红,唇膏等等。
以上是关于unity 皮肤材质效果实现分析的主要内容,如果未能解决你的问题,请参考以下文章
游戏开发实战Unity实现类似GitHub地球射线的效果(LineRenderer | 贝塞尔曲线)