卡通风格的渲染【Unity Shader入门精要14.1】

卡通渲染的方法之一:基于色调的着色技术(tone-based shading)。P288

实现中,我们往往会使用 漫反射系数 对一张一维纹理进行采样,以控制漫反射的色调 。(7.3节中用渐变纹理实现过这种效果)

卡通风格的高光往往是一块分界明显的纯色区域。

除了光照模型不同外,卡通风格通常还需要在物体边缘部分绘制轮廓,本节使用基于模型的描边方法

14.1.1渲染轮廓线

在实时渲染中,轮廓线的渲染是应用非常广泛的一种效果,在《Real Time Rendering,3rd》一书中,作者把这些方法分成了5种类型:

  1. 基于观察角度表面法线的轮廓渲染:适应视角方向和表面法线点乘结果来得到轮廓线的信息。这种方法简单快捷,可以在一个Pass中就得到渲染结果,但局限性很大,很多模型渲染出来的描边效果都不尽如人意。
  2. 过程式几何轮廓线渲染:核心是使用两个Pass渲染,第一个渲染背面的面片,并使用某些技术让他的轮廓可见,第二个Pass再正常渲染正面的面片。这种方法的优点在于快速有效,并适应于绝大多数表面平滑的模型,但缺点是不适合类似立方体这样平的模型。          (本节使用这种,第一个Pass使用轮廓线颜色渲染整个背面的面片,并在视角空间下把模型顶点沿着法线方向向外扩张一段距离,以此来让背面的轮廓可见
    viewPos = viewPos + viewNormal*_Outline;
    但是,如果直接使用顶点法线进行扩展,对于一些内凹的模型,就可能发生背面面片遮挡正面面片的情况。为了尽可能防止出现这样的情况,在扩展背面顶点之前,我们首先对顶点法线的Z分量进行处理,使他们等于一个值,然后把法线归一化后再对顶点进行扩张,这样的好处在于,扩展后的背面更加扁平化,从而降低了遮挡正面面片的可能性
    viewNormal.z=-0.5;
    viewPos=normalize(viewNormal);
    viewPos=viewPos+viewNormal*_Outline;
    
  3. 基于图像处理的轮廓线渲染边缘检测方法就属于这种类型,优点在于可以适用于任何类型的模型。但也有自身的局限所在,一些深度和法线变化很微小的轮廓无法被检出来,如桌子上的纸。
  4. 基于轮廓边检测的轮廓线渲染:上面提到的方法中一个最大的问题就是无法控制轮廓的风格,想渲染出如水墨风格的轮廓线,为此,需要检测出精准的轮廓边,然后直接渲染他们,检测一条边是否是轮廓边的的公式很简单,只需要检查和这条边相邻的两个三角形是否满足下面的条件:(n_{0}\cdot v>0)\neq (n_{1}\cdot >0)   其中,n0和n1分别表示两个相邻的三角形面片的法向,v是从视角到该边上任意顶点的方向。上诉公式的本质在于检查两个相邻的三角面片是否是一个朝正面,一个朝背面。我们可以在几何着色器(Geometry Sahder)的帮助下实现上面的检测过程,当然,这种方法的缺点除了实现相对复杂外,还有动画连贯性的问题,也就是说由于是逐帧单独提取轮廓,所以在帧与帧之间会出现跳跃性。
  5. 混合上述的几种渲染:例如,首先找到精准的 轮廓边,把模型和轮廓边渲染到纹理中,再使用图像处理的方法识别出轮廓线,并在图像空间下进行风格化渲染。

14.1.2 添加高光

对于卡通渲染的高光反射光照模式,需要计算normal和halfDir的点乘结果,把该值和一个阀值进行比较,如果小于阀值,则高光反射系数为0,否则1。

float spec=dot(worldNormal,worldHalfDir);
spec=step(threshold,spec);

CG 的Step函数:(参考值,待比较值)如果第二个大于第一个则返回一。

但是,这种磁暴的判断方法会在高光区域的边界造成锯齿。原因在于高光区域的边缘不是平滑渐变的,而是由0突变到1,想进行抗锯齿处理可以在很小的一块区域内,进行平滑处理

float spec=dot(worldNormal,worldHalfDir);
spec=lerp(0,1,smoothstep(-w,w,spec-threshold));

CG 的smoothstep函数:w是一个很小的值,当spec-threshould小于-w时返回0,大于w时返回1否则在0到1之间进行插值。

这样的效果是可以在[-w,w]区间内,即高光区域的边界处得到一个从0到1平滑变化的spec值,从而实现抗锯齿的目的。

像素之间的近似导数值用 CG的 fwidth 函数来得到。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(卡通风格的渲染【Unity Shader入门精要14.1】)