基于Unity的三渲二(Toon Shader)风格化的简化方案

最近在制作游戏,在研究shader的时候发现我并不适合使用shader graph这种图形化的编程,于是想用代码写一个着色器(就像OpenGL的着色器那样),然后就发现可能shader更有操作空间。

我想写一个Toon 风格的shader,网上当然其实有很多教程,但是我发现即使是三渲二这样子的材质,大部分写法还是严格遵循phong模型进行渲染,也就是最终着色效果受固有色,光照强度(法线和光线方向)和环境光的影响。当然这样子渲染出来的模型更逼真,但是也少了一点风格化,因为在不使用光线追踪的情况下,表达出环境间接光照也比较复杂。

上文提到了少了一点风格化,其实是因为在绘画过程中经常可以看到“藏色”,实际上就是光追可以呈现的间接光照所呈现的效果,在暗面尤其突出。

环境间接光照可能会导致最终渲染的颜色和物体固有色处于不同色相,然而固有色和“灰度”的叠加往往达不到这种效果,所以我干脆在同一个材质上设置了两个阈值(与法线和光线方向的点乘相比),最终划分出三个区域(高光,灰,暗),每个区域的颜色均可以编辑,不受色相的限制。

这是最终的效果(邦尼):

这是其中一个材质球的参数:

可以看出来二、三个区域完全不属于同一个色相。

其实只需要在片元着色器那里做一些改变就可以了。

fixed4 frag (v2f i) : SV_Target
{
    UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);
    atten = lerp(1.0, atten, _ShadowStrength);
    
    // 从这里开始
    float NdotL = dot(normalize(i.worldNormal), normalize(_WorldSpaceLightPos0.xyz));
    NdotL = max(NdotL, 0.0);

    fixed4 color;

    if (NdotL > _Specular)
        color = _ColorBright;
    else if (NdotL > _Mid)
        color = _ColorMid;
    else
        color = _ColorDark;
    // 到这里结束


    color.rgb *= atten;
    
    UNITY_APPLY_FOG(i.fogCoord, color);
    return color;
}

根据点乘结果和阈值划分区域,点乘结果就是NdotL,阈值就是_Specular和_Mid两个参数。

### Unity 中实现效果的方法 对于希望在 Unity 中实现(3D染成2D风格)效果的情况,可以考虑多种插件和技术方案来达成目标。一种流行的方式是利用卡通着色器或者特殊的后期处理效果。 #### 使用 Toon Shader 实现效果 Toon Shader 是创建具有手绘外观的 3D 对象的有效工具之一[^1]。通过调整边缘检测参数、光照模型以及颜色渐变设置,能够使场景中的物体呈现出维动画般的视觉特征。为了更好地控制最终的艺术表现形式,还可以自定义材质属性并应用不同的纹理贴图。 #### 应用 Post Processing Stack V2 进行艺术化滤镜处理 Post Processing Stack 提供了一系列强大的图像特效功能,在此之上添加特定于漫画或动漫样式的过滤器可以帮助强化整体画风的一致性和独特性。例如,可以通过配置 Bloom 效果增强高光部分;使用 Color Grading 工具微调色调曲线以匹配预期色彩氛围;或是启用 Grain Filter 来模拟传统纸张质感等特性[^2]。 #### 考虑第方资产商店资源 除了内置的功能外,Unity Asset Store 上也有许多专门针对需求设计的产品可供选购。这些预构建好的解决方案往往已经过优化测试,并附带详细的教程指导快速集成到项目当中去。其中一些知名的选择包括 Cel Shading Pro 和 Anime Studio 等。 ```csharp // 示例:如何在脚本里切换不同类型的Shader Renderer renderer = GetComponent<Renderer>(); Material material = new Material(Shader.Find("Custom/ToonShader")); renderer.material = material; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值