【01】从零开始的卡通渲染-描边篇

本文深入探讨了Unity中的卡通渲染技术,特别是BackFacing描边方法。首先介绍了卡通渲染的基本概念和NPR类型,接着详细阐述了通过两次绘制实现的BackFacing描边技术,包括如何处理摄像机距离导致的描边宽度变化问题,以及解决不光滑物体描边断边的优化策略。此外,还利用顶点色控制描边的粗细和颜色,进一步增强了描边效果。最后,文章总结了这一节的内容,并预告了后续将讨论的卡通渲染光照计算的实现方法。

序言:

一直对卡通渲染非常感兴趣,前后翻找了不少的文档,做了一些工作。前段时间《从零开始》的手游上线了,试着渲染了一下的其中模型,觉得效果很不错。打算写一个专栏记录其中的渲染技术。在后面的篇章中也想展示一下各个项目中卡通渲染技术的变迁,以及讨论未来的一些发展方向。
卡通渲染属于非真实感渲染(Non-photorealistic rendering,简称NPR)。对应的还有真实感渲染(Photorealistic rendering)。后者旨在渲染真实感的画面,而前者则追求更加有艺术感的画面效果,例如手绘风格的画面。
NPR也有各种各样的类型。比如像油画,铅笔画,水墨画风格的画面。这里主要探讨像日本动画那样的卡通渲染风格,目前一般称之为Cel Shading。卡通渲染在日本那边很早就在主机游戏上使用,经过了很多尝试和变迁,最终在《GUILTY GEAR Xrd》系列游戏达到了非常不错的水准。国内的厂商在吸收了日本同行的经验以后,也制作了非常好的作品,并且在此之上创新,提出了更多的解决方案。
说了很多,现在回归正题。描边是卡通渲染的一个非常重要的主题。目前比较流行的描边方法有两种,一个是通过两次绘制,一次绘制角色,一次绘制描边。还有一种是基于后处理的描边。基于后处理的描边相对不容易定制,比较适用于对复杂场景进行描边。这里讲述通过2次绘制来绘制描边的方法。在《GUILTY GEAR Xrd》中称其为Back Facing法。

Back facing描边法

基本思路是通过两次绘制,第一次绘制角色,第二次绘制描边。绘制描边的时候,在顶点着色器将顶点沿着法线方向位移一段距离,使得模型轮廓放大,渲染作为描边。同时描边绘制时使用cull front。这样描边和角色重叠的部分会因为不能通过深度检测而cull掉,保证描边不会遮挡角色。两次绘制颠倒顺序也是可以的,不过后绘制描边,可以通过深度检测过滤掉很多描边绘制的像素,效率会更好。这里先实现最简单的方法,然后逐步进行优化。
    
    
    
Shader "Unlit/Ouline" { Properties { _OutlineWidth ( "Outline Width" , Range ( 0.01 , 1 ) ) = 0.24 _OutLineColor ( "OutLine Color" , Color ) = ( 0.5 , 0.5 , 0.5 , 1 ) } SubShader { Tags { "RenderType" = "Opaque" } pass { Tags { "LightMode" = "ForwardBase" } Cull Back CGPROGRAM # pragma vertex vert # pragma fragment frag #include "UnityCG.cginc" float4 vert ( appdata_base v ) : SV_POSITION { return UnityObjectToClipPos ( v . vertex ) ; } half4 frag ( ) : SV_TARGET { return half4 ( 1 , 1 , 1 , 1 ) ; } ENDCG } Pass { Tags { "LightMode" = "ForwardBase" } Cull Front CGPROGRAM # pragma vertex vert # pragma fragment frag #include "UnityCG.cginc" half _OutlineWidth ; half4 _OutLineColor ; struct a2v { float4 vertex : POSITION ; float3 normal : NORMAL ; float2 uv : TEXCOORD0 ; float4 vertColor : COLOR ; float4 tangent : TANGENT ; } ; struct v2f { float4 pos :
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值