cg_bull 发表于 2017-12-25 00:52:05

Unity角色渲染系列之"屏幕空间次表面散射"

本帖最后由 cg_bull 于 2018-9-14 11:47 编辑

    前言。
    游戏中的角色渲染技术自从次世代主机发布以来得到了很大的视觉进步,而且很多游戏也都相继采样了,比如神秘海域4,这里我给大家介绍一些角色渲染的技术分类和分支。这一篇主要说说皮肤的渲染,以后会陆续说到毛发 眼睛 布料 透明涂层的介绍。

    皮肤是一个有很多层的组织,表面分布的一些油脂是表现高光反射的一个重要点。然后就是表皮层和真皮层通常是一起表现次表面散射的点。电影级别都是直接追踪光线来模拟这种效果,但是游戏的话属于实时渲染每帧做光线追踪肯定不现实,所以业界大佬发明了很多造假手段。分为三大类就是屏幕空间和贴图空间和预处理。


   次表面散射在实时渲染里面的使用一般都是通过吧图像存储起来然后进行高斯模糊每次模糊的同时叠加一些色素颜色(色素颜色就代表一个描述文件Profile,它描述每个像素的光照收到周围像素影响的范围一般里面是存贮着SubsurfaceRange和SubsurfaceColor),最后把模糊结果线性混合就是最终的次表面效果了。而且模糊方式也分为屏幕空间和贴图空间两种。首先介绍一下贴图空间的方法。   贴图空间(TextureSpace)
   第一步是在顶点着色器中将模型的UV坐标输出到屏幕位置,然后输出模型每个顶点的世界坐标,在像素着色器中逐像素进行漫反射光照和阴影的计算,生成一张Irradiance Map。
   第二步则是对Irradiance Map进行高斯模糊,用Profile来确定每次的高斯模糊的加权色素颜色,然后生成很多张不同模糊后的图形(一般是六张)。
   第三步则是把第二步生成的六张图像线性混合在一起然后再和高光效果相加最后输出在屏幕上就是我们看到的次表面效果了。
   2008年Nvidia推出过一个HumanHead的Demo演示,里面就是用的此方法效果非常赞。




   预处理方法(PreintegratedSkin)
   这个方法感觉比较有趣,是一个从结果去推理实现的技术。这个技术的发明者认为次表面散射多发生在光照环境变化较大的地方也就是说曲率比较大的地方散射胸越明显,比如鼻梁和脸部明显鼻梁更强烈的散射效果,再就是一个受光照的球背面黑色正面接受光照中间过度的地方是最有散射效果的。作者呢也抽象的吧次表面散射结果换成了一张2D的LUT,通过Shader计算出曲率然后带入LUT的UV即可实现次表面散射的效果,最后为了表现法线贴图的次表面作者还引入了BentNormal来代入计算。

这个Unity商城也有一个实现方法的资源,大家可以合理购买去Unity资源分享区(滑稽)。这个方法使用的游戏貌似只在教团1886里面见过。



   屏幕空间方法(Screen Space Subsurface)
该方法与之前的贴图空间是一个原理,只是贴图空间是在模型贴图空间下去做散射处理,而屏幕空间则是直接在屏幕空间进行处理。比如你做一个后期材质处理的输入是不是得先输入SceneColor呢?而贴图空间则是单独把这些内容渲染到一张该模型投影坐标为基础的贴图里面处理最后替换效果实现,而屏幕空间就不需要了因为直接就有SceneColor用,处理完直接输出返回即可。而且由于方法和贴图空间差不多所以性能消耗基本上都是差不多级别的,因为次世代角色贴图基本都是1K 2K的实时去模糊多次这么高精度的贴图机器肯定吃不消,这里作者用了一个巧妙的手段就是屏幕空间加Stencil。因为屏幕分辨率有限目前PC也就高端4K而人头在这里面最多也就占据不过512大小1080P分辨率就更不用说了最后加上Stencil区分次表面模型更是减少了性能消耗。而且作者还热情的开源了实现。现在几乎所有游戏比如神秘海域4 最终幻想15 UE4 CE5都采用了该方法去实现次表面效果。


   而且该方法的发明者是来自动视的大佬,下面放一些他的实现效果。




可以很清楚的看到有次表面和没次表面的差距。。再来一些。






   透射(Transmittamce)
这里有必要科普一下。我认识的百分之90的碰过CG的人都认为次表面散射和透射是一个东西来的,但其实这是两种完全不同的现象。。。具体可以参考下面的引用9
代码地址 : https://link.zhihu.com/?target=https%3A//github.com/haolange/UnityCharacterRender_SeparableSubsurfaceScatter

引用
1 d'Eon, Eugene. NVIDIA Demo Team Secrets–Advanced Skin Rendering2 John Hable. Uncharted 2: Character Lighting and Shading3 Jorge Jimenez, Károly Zsolnai, etc. Separable Subsurface Scattering4 Eric Penner, George Borshukov. GPU Pro 2, Pre-Integrated Skin Shading5 David Neubelt, Matt Pettineo. Crafting a Next-Gen Material Pipeline for The Order: 18866 Eugene d'Eon, David Luebke. GPU Gems 3, Chapter 14. Advanced Techniques for Realistic Real-Time Skin Rendering7 Jorge Jimenez, David Whelan, etc. Real-Time Realistic Skin Translucency8 John Isidoro, Chris Oat, Jason Mitchell. Next Generation Skin Rendering
9 角色渲染技术——皮肤(作者:洛城). https://zhuanlan.zhihu.com/p/27014447
10 UE4蓝图与材质的使用极限(作者:ycz).https://www.zhihu.com/people/ycz-19/posts

kakalot 发表于 2017-12-25 08:48:33

感谢分享~全屏幕物体都参与次表面计算性能不会很好吧...和这个的原理一样吗?它的可以选择单个3d物件和贴图蒙板,不知道对你有没有参考价值

kakalot 发表于 2017-12-25 08:51:53

附件里是空文件...:L

zapon5337 发表于 2017-12-25 09:14:57

感谢分享

letian100 发表于 2017-12-25 11:48:58

感谢大神分享,支持,支持,辛苦啦

fairyindex 发表于 2017-12-25 16:42:57

感谢大神分享,大神越来越溜了

cg_bull 发表于 2017-12-25 16:44:33

fairyindex 发表于 2017-12-25 16:42
感谢大神分享,大神越来越溜了

大家一起溜溜溜(滑稽)!

cg_bull 发表于 2017-12-25 23:40:00

kakalot 发表于 2017-12-25 08:48
感谢分享~全屏幕物体都参与次表面计算性能不会很好吧...和这个的原理一样吗?它的可以选择单个3d物件和贴图 ...

你可以自己试着魔改,用Stencil去区分皮肤材质,这样就可以做到只渲染皮肤部分了。但是我还不清楚Unity的Stencil的机制。可能得等一段时间才能做出出来了。或者大佬你先做出来分享也好啊。。

cg_bull 发表于 2017-12-25 23:40:35

kakalot 发表于 2017-12-25 08:48
感谢分享~全屏幕物体都参与次表面计算性能不会很好吧...和这个的原理一样吗?它的可以选择单个3d物件和贴图 ...

谢谢,我看看他怎么实现的。应该有帮助

cg_bull 发表于 2017-12-26 00:57:16

kakalot 发表于 2017-12-25 08:48
感谢分享~全屏幕物体都参与次表面计算性能不会很好吧...和这个的原理一样吗?它的可以选择单个3d物件和贴图 ...

刚刚看了那个SSSSS的源代码,他是用CommandBuffer去做的,可以试试能不能在这个里面实现。感觉他的效果没我的好。。。
页: [1] 2 3
查看完整版本: Unity角色渲染系列之"屏幕空间次表面散射"