非真实感渲染入门
非真实感渲染入门
图形学渲染风格主要分为真实感渲染(Photorealistic rendering)和非真实感渲染(Non-photorealistic rendering,NPR)两大类。不同于真实感渲染是为了渲染出照片级别的画面,非真实感渲染主要在于模拟艺术化的绘制风格,呈现出手绘的效果。常见的非真实渲染技术包括卡通渲染、油画渲染、像素感渲染、铅笔画、素描画、蜡笔画和水墨画等类型。
卡通渲染(Cel Shading/Toon Shading)
卡通渲染是NPR领域应用最广的渲染技术,在影视和游戏领域十分常见。如《你的名字》,塞尔达传说:荒野之息,Okami和原神等作品。
卡通渲染在游戏领域主要分为美式卡通风格和日式卡通风格两种。其中美式卡通色彩上比较连续,不会出现明显的色块分界线,如堡垒之夜;而日式卡通在着色方面会有明显的色块,色块的分界线清晰,如崩坏3。
描边(Outline Rendering)
在Real-Time Rendering一书中将描边技术分为了以下五大类:基于法线和视角的描边( Shading Normal Contour Edges)、过程式的几何描边( Procedural Geometry Silhouetting)、基于图片处理的描边( Edge Detection by Image Processing)、基于轮廓线检测的描边( Geometric Contour Edge Detection)和混合以上几种描边方法(Hybrid Silhouetting)。
基于法线和视角的描边
通过观察,位于边缘的法线与视线方向的夹角接近90°,因此可以使用视线方向和法线方向的点积结果来获取轮廓线的信息。
但这种方法会导致描边的粗细不均匀。
过程式几何描边
基本思路是通过两次绘制,第一次绘制角色,第二次绘制描边。绘制描边的时候,在顶点着色器将顶点沿着法线方向位移一段距离,使得模型轮廓放大,渲染作为描边。
基于图像处理的方法
基于图像的算法是通过图像处理的方法来进行边缘检测,一般用于屏幕空间的检测。我们通常使用深度、法线、亮度和颜色等属性作为边缘判断的依据。
左上角是法线图,中上是深度图,左下是法线图得到的边缘,中下是深度图得到的边缘,右上是经过加粗(取周围一定范围内的最深的像素的颜色为自身的颜色)的边缘图,右下是最后的结果。
着色
在卡通渲染中,尤其是日式的卡通渲染中,色阶较少且着色一般不是连续的,存在非常明显的颜色分界线。
漫反射
漫反射亮度采用Lambert模型,再进行阈值化。一般会根据NdotL = dot(normal,lightDir)的结果与阈值比较来指定不同的颜色值,从而模拟卡通色块的着色效果;除了这种方法之外,更常见的处理方式是利用NdotL的结果从一维渐变纹理RampTexture中进行采样
有些时候也会使用平滑阶跃函数柔化明暗边界,这样比较容易使角色与场景融合也起到一定的抗锯齿效果。
高光
根据法线和半向量的点积,与高光阈值比较,控制高光的范围。
Stylized highlights for cartoon rendering and animation
风格化高光
边缘光
物体的边缘会有一圈边缘光,实现比轮廓线更好的边界区分效果。这里的实现和基于法线和视角的描边一样。
NPR与PBR的结合