《Twin Souls: Path of the Shadows》是一款游戏性很强,且具有优质卡通渲染效果的端游,本文我们一起来看看如何使用Unity的渲染管道来实现像《Twin Souls: Path of the Shadows》一样的卡通渲染的效果。
 


卡通渲染的原理
卡通渲染是一种非真实感渲染,也叫作Cel Shading或Toon Shading,旨在通过使用较少的阴影颜色,而非阴影梯度或色调及阴影,使3D计算机图形显得平坦。
 


上图中,从左至右分别是Diffuse着色器,Cel Shading和有三个阈的Cel Shading。 我们认为一个像素接收的光量是光方向和表面法线之间的点积(NdotL)。如果将此值取整为0或者1,或者定义不同的“等级”或“阈”,将导致不同的卡通渲染样式。在最简单的卡通渲染中,如果点积大于零,则将像素设置为点亮,如果点积小于零,则将像素设置为阴影。

实现方法
此效果可以根据您的渲染路径(Rendering Path)以不同的方式实现。渲染路径(Rendering Path)可以在相机的检视面板(Inspector)中设置。下面我们介绍一下正向渲染和延迟渲染。

正向渲染
如果您的场景不使用多光源,正向渲染(Forward Rendering)是一个不错的选择。因为在这种模式下,渲染引擎会遍历所有光源的每个顶点和像素,可能会带来较大负担。 然而,如果您的场景只有几个或甚至一个光源,这个解决方案是非常轻量级的。具体实施的时候,您可以创建一个新的表面着色器(surface shader)。

您可以创建一个新的表面着色器(surface shader)如下:?

Shader "Custom/CelShadingForward" {
    Properties {
        _Color("Color", Color) = (1, 1, 1, 1)
        _MainTex("Albedo (RGB)", 2D) = "white" {}
    }
    SubShader {
        Tags {
            "RenderType" = "Opaque"
        }
        LOD 200
 
        CGPROGRAM
        #pragma surface surf CelShadingForward
        #pragma target 3.0
 
        half4 LightingCelShadingForward(SurfaceOutput s, half3 lightDir, half atten) {
            half NdotL = dot(s.Normal, lightDir);
            NdotL = 1 + clamp(floor(NdotL), -1, 0);   //把NdotL设置为0(小于0)或设置为1(大于0)
            half4 c;
            c.rgb = s.Albedo * _LightColor0.rgb * (NdotL * atten * 2);
 

锐亚教育