unity 3d物体描边效果_Unity素描渲染毕业设计的 总结笔记(I)

8b7a48177e37427f9e6c1f520a596f32.png

基于法线和深度值的屏幕后处理风格化描边算法

“即便是烟雾,也必须用线条来表现。” 让·奥古斯特·多米尼克·安格尔,新古典主义画派大师如是说。线条对于体现物体表面的张力与形态,在传统绘画中占有无与伦比的地位。而素描作为艺术的标尺和创造轮廓的途径,自然与线条紧密地结合在一起。因此,好的描边算法对于模拟素描风格的渲染技术而言,其重要性自然不言而喻。本章中,作者阐述了自己在项目中对素描风格描边算法的一些调查与研究。

基本原理

总的来说,该算法利用了实时渲染每帧产生的深度和视角空间法线纹理中的不连续性,使用传统的边缘探测算法来提取出边缘作为描边结果。

Saito与Takahashi [1]建议对z-buffer使用Sobel算子进行边缘探测,因为物体的轮廓往往与深度缓冲中0阶不连续(C0)的像素相重合,因此基于深度缓冲的边缘探测可以有效地得到物体内外部的大致轮廓。而Hertzmann[2]在该方法的基础上增加了对法线缓冲的边缘探测,法线缓冲能够探测1阶不连续的边缘,即那些z值变化不大,但表面方向发生比较剧烈变化的地方。两种方法结合起来,可得到较理想的结果。

算法的优缺点分析

基于深度与法线的屏幕空间边缘探测算法,也是目前在实时渲染方面应用较多的一种算法,作者认为其主要优点包括以下几方面:

  1. 鲁棒性强:屏幕空间探测算法不需要对渲染过程做太多修改,可以作为屏幕后处理插件来整合到渲染器或游戏引擎内;例如,目前无论实时还是离线的CG制作流程中,都会为增加模型视觉细节而搭配法线贴图,偏移贴图,细节凹凸贴图等贴图,而这些细节的描边显然是通过直接处理几何信息所无法得到的。而屏幕后处理算法处理的是最终的渲染结果,因此可以探测到这些边缘。
  2. 灵活简便:能很好地与当前主流的游戏引擎相耦合,以Unity引擎为例,无论是前向渲染路径(Forward Rendering)还是延迟渲染路径(Deferred Rendering),都可以在渲染时自动生成含有深度与世界法线信息的纹理。
  3. 性能理想:因为只涉及屏幕后处理中进行卷积计算,并且计算量与场景中模型个数无关,因此与涉及几何信息处理(Geometry Shader)的算法相比,性能消耗总体较低且能保持稳定。这一点在实际应用中可以得到证明,例如最有名的带有实时描边效果的一款游戏《无主之地》,整个游戏中都使用的是该描边方法,并达到了理想的渲染帧率和画面表现力。

屏幕空间算法尽管有上述的种种优点,但也有一些缺点:

  1. 对于边缘线的各种属性,用户很难进行有效的控制,例如,边缘的粗细程度,各种不同性质边的分类(内轮廓,外轮廓,自相交的边,物体的边界)等等。
  2. 进一步的风格化存在难度。因为由屏幕空间算法探测到的边缘信息只体现为一张单纯的边缘强度纹理,并没有附带任何数学上的分析性质。因此要想使用传统的笔刷模拟算法来在这些线上实现风格化的笔刷效果,是几乎不可能做到的。

算法的扩展和改进

我们将从三个方面来改进算法。首先是对描边结果进行抗锯齿处理;其次对描边结果进行仿抖动处理;最后,增加铅笔笔触和纹理效果。

描边的抗锯齿处理. 描边的结果往往会有一些锯齿,这对于达到理想的视觉效果是不利的。另一方面,平滑的描边结果对后面的扰动效果也是十分重要的:如果描边结果锯齿过多,那么扰动过后会有许多碍眼的噪点。因此该项目使用了FXAA抗锯齿算法来得到平滑的描边结果。

6cc2068025fcfb8c2ea89e049ac2a96b.png
图2-1 左图为未处理过的描边结果,右图为进行FXAA后的结果。

模拟手绘描边的抖动效果. 虽然在该算法中,由于没有对描边曲线进行参数化,因此很难使用传统的笔刷模拟算法来实现描边的风格化;但还是有一些比较特殊的手段。如Nienhaus等[3]提出的算法,利用3D噪声对描边结果进行扰动,以模拟手绘过程中由于人手有意或无意的抖动而导致的与实际的边缘不一致的弯曲线条。其基本原理是将3D噪声投射到网格模型表面上,作为模型的纹理渲染出一张贴图;随后将描边结果根据该帖图中相应位置的噪声值进行扰动处理。在本项目的实现中,我们对其算法进行了改进和扩展。

原文为了避免“Shadow door”效果,需使3D噪声的扰动效果与物体几何性质绑定在一起,因此将网格模型顶点沿着法线膨胀,然后把3D噪声投射到膨胀的模型上得到一张渲染纹理,最后根据该纹理对描边结果进行扰动;在实际应用中,这种膨胀处理对于光滑的模型比较适用,但是对于硬表面模型则不然。对于有着多个顶点法向量的顶点,可能在膨胀的过程中分离为多个顶点,从而撕裂网格模型。改进为根据模型的包围盒中心对模型进行放大操作后就可以解决该问题。设最终输出到屏幕上的值为 ,顶点的模型空间坐标为 , 顶点在屏幕上所在的像素坐标为 , 顶点所属物体的包围盒中心表示为 , 3D噪声可以表示为一个映射函数Noise(x, y, z)。

9e96a560580c8e05e73aad0a0d363dcb.png
图2-2 3D噪声投射到场景网格模型后所得的结果

单独使用噪声来进行扰动并不能得到很理想的结果,原因有二:其一,画家在绘制素描线稿时,不仅是每条线会发生抖动,而且由于手绘的线条总会有好几条与其近乎平行的线条来起到补充调整的效果,而且由于人手运动时的惯性,有些线条会被绘制得过长,从而超出原来应有的长度。基于以上的观察,作者提出了一种改进方案:

根据顶点的切线在屏幕空间(即NDC空间)上的投影的xy分量单位化后的向量来做扰动(如果希望取得更好的结果,可以尝试更多的方向),可得到与原线条线平行的4条线,再对这些线与原线条一起根据噪声进行扰动,如图2-3所示。

b1b5874ea1565efbf4188111df76636c.png
图 2-3 左图为切线在屏幕空间的xy分量,右图的小箭头显示了左图各处对应的扰动方向。

40317a9fe5adfa61dd3b7a93c42b9d81.png
图2-4扰动后的结果

作者也尝试过使用顶点法线而非切线来驱动描边的扰动,但经过比较,至少在本测试场景中,使用切线是更好的选择。值得注意的是,由于切线方向与UV贴图的分割摆放方式有关,因此最好能将各个物件模型的UV贴图按照横平竖直的方式摆放。

模拟铅笔笔触和纹理. 尽管前面的步骤得到了比较好的线条抖动效果,但是由于是由边缘探测得到的线条都是连续的一些黑线,没有铅笔的纹理,因此作者使用了一种特殊的图像处理算法:Slope Blur算法,该算法为一个循环的过程,每次迭代时,都将图像依据一张输入的贴图进行与当前迭代次数成反比强度的扰动,并与上次迭代所得的结果图像按照设定的模式混合,本项目中使用的是正片叠底混合模式。

ecba499bb4eca00971a43574c57bd651.png
图 2-5 处理后的结果(循环次数为5)

本章小结

总的来说,通过以上描述的风格化描边算法,我们较好地模拟了素描的描边效果。但是仍然有以下几点有待改进:

  1. 描边粗细程度应当可以变化和控制,并且有些边应当具有逐渐淡去的效果。
  2. 可以尝试Object Space的算法对描边结果进行参数化。
  3. 铅笔笔触凹凸不平的法线纹理应当也得到合适的模拟。

参考

  1. ^[1] Takafumi Saito and Tokiichiro Takahashi. Comprehensible rendering of 3-D shapes[J]. Computer Graphics (ACM SIGGRAPH),24(4): 197-206 (1990) http://xueshu.baidu.com/usercenter/paper/show?paperid=daf70d1b10a6b5af09cee1862e0009c0&site=xueshu_se
  2. ^[2] Aron Hertzmann. Introduction to 3d non-photorealistic rendering: Silhouettes and outlines[J]. Non-Photorealistic Rendering. SIGGRAPH, 99(1) (1999). https://pdfs.semanticscholar.org/1b8e/84805500e43756ff0e663d40747dd5171a5a.pdf
  3. ^[3] Marc Nienhaus and Jürgen Döllner. Sketchy drawings[J]. Proceedings of the 3rd International Conference on Computer graphics, Virtual reality, Visualization and Interaction in Africa, ACM, pp. 73-81 (2004) http://xueshu.baidu.com/usercenter/paper/show?paperid=c25c72aa1b57cd60d6790895a4909085&site=xueshu_se
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值