UnityShader入门精要第十四章-非真实感渲染原理总结

前言

开发中常常遇到的一个问题就是画面风格。接下来要介绍的就是统一修改画面风格的手段:非真实感渲染。这里同样只总结原理。

非真实感渲染

非真实感渲染 (Non-Photorealistic RenderingNPR) 的方法来渲染游戏画面。非真实感渲染的一个主要目标是,使用一些渲染方法使得画面达到和某些特殊的绘画风格相似的效果,如卡通、水彩风格等。

卡通风格

使用这种风格的游戏画面通常有些共有的特点,例如物体都被黑色的线条描边,以及分明的明暗变化等。

实现卡通风格的方式有很多,其中之一就是使用基干色调的着色技术。Gooch 等人在他们 1998 年的一篇论文中提出并实现了基于色调的光照模型。在实现中,常使用漫反射系数对一维纹理进行采样,以控制漫反射的色调;其高光效果也和我们之前学习的光照不同,在卡通风格中,模型的高光往往是一块块分界明显的纯色区域。

......

除了光照模型不同外,卡通风格通常还需要在物体边缘部分绘制轮廓。在之前的章节中,我们曾介绍使用屏幕后处理技术对屏幕图像进行描边。在本节,我们将会介绍基于模型的描边方法,这种方法的实现更加简单,而且在很多情况下也能得到不错的效果。

渲染轮廓线

书中提到五种方案:

  1. 基于观察角度和表面法线的轮廓线渲染。这种方法使用视角方向和表面法线的点乘结果来得到轮廓线的信息。这种方法简单快速,可以在 Pass 中就得到渲染结果,但局限性很大,很多模型渲染出来的描边效果都不尽如人意。

  2. 过程式几何轮廓线渲染。这种方法的核心是使用两个Pass渲染。第一个Pass 渲染背面的面片,并使用某些技术让它的轮廓可见(常常是法线外扩);第二个Pass再正常渲染正面的面片。这种方法的优点在于快速有效,并且适用于绝大多数表面平滑的模型,但它的缺点是不适合类似于立方体这样平整的模型。

  3. 基于图像处理的轮廓线渲染。在第12、13章介绍的边缘检测的方法就属于这个类别。这种方法的优点在于可以适用于任何种类的模型。但它也有局限,一些深度和法线变化很小的轮廓无法被检测出来,例如桌子上的纸张。

  4. 基于轮廓边检测的轮廓线渲染。上面提到的各种方法,一个最大的问题是,无法控制轮廓线的风格渲染。对于一些情况,我们希望可以渲染出独特风格的轮廓线,例如水墨风格等。为此,我们希望可以检测出精确的轮廓边,然后直接渲染它们。检测一条边是否是轮廓边的公式很简单,只需要检查和这条边相邻的两个三角面片是否满足以下公式。

    \[(n_{0}·v > 0)≠(n_{1}·v > 0) \]

    其中n0n1分别表示两个相邻三角面片的法向,v是从视角到该边上任意顶点的方向。上述公式的本质在于检查两个相邻的三角面片是否一个朝正面、一个朝背面。这种方法也有缺点,除了实现起来相对复杂外,它还会有动画连贯性的问题。也就是说,由于是逐帧单独提取轮廓,所以在帧与帧之间会出现跳跃性。

  5. 最后一个种类就是混合了上述的几种渲染方法。例如,首先找到精确的轮廓边,把模型和轮廓边渲染到纹理中,再使用图像处理的方法识别出轮廓线,并在图像空间下进行风格化渲染。

书中给出的描边代码示例正是使用了法线外扩来实现的,但要注意此方案不适用于棱角分明的物体,比如立方体,应用时会发现各个描边面之间出现空隙。

高光反射

Blinn-Phong模型不同,卡通风格的高光反射在计算normalhalfDir的点乘结果后,会把该值和一个阈值进行比较,如果小于该阈值,则高光反射系数为0,否则返回1

素描风格

需要一组素描风格的多级渐远纹理。
在顶点着色器中,根据光照结果来决定这一组纹理的混合权重;
在片元着色器中,根据混合权重来混合这组纹理的采样结果。

参考资料

法线外扩法-白泽图博客园

posted @ 2023-11-01 20:18  AshScops  阅读(64)  评论(0编辑  收藏  举报