Unity自带了很多shader,其中就包含卡通渲染和描边的shader。但是我在实际开发游戏的过程中还是遇到了这些shader无法解决的问题。
于是,我们需要理解如何写Unity的shader,并且按照我们自己的需求编写一个新的shader。
大多数情况下,我们遇到的实际问题要比一个酷炫的demo复杂和恶心。就像Daikon Forge GUI插件非常完善的Atlas图集功能却因为我们的GUI图片元素过多而变得非常鸡肋,甚至不得不做修改。 或者明明很正常的Dynamic Font功能却因为我们要渲染的文字繁而多,变得bug频频。
我们因为游戏风格和玩法的特殊需求,所以我们需要这样一个shader:
1、卡通渲染(这个主要是使用卡通渲染掩盖本身模型和贴图的不给力)
2、支持透明贴图 (我们很多模型使用了透明贴图,当时主美的说法是使用透明贴图可以减少很多面数,但是现在看来,如果我为了支持透明贴图而禁用了剔除,说不定反而是得不偿失的做法)
3、不依赖灯光 (毕竟我们的游戏不是3D的MMO,而且即便是火炬之光似乎在人物渲染的时候也是不依赖灯光的,对于我们的游戏风格而言,如果因为灯光造成明显的明暗区分是会削弱表现的)
4、最好有灯光影响 (这个跟上一点不冲突,灯光可以在shader中计算,场景中无论有没有灯光,人物都会有一定的明暗区分,很多情况下这个是加分的)
5、能够正确处理好透明和剔除 (如果处理不正确,要么会使人物表现错乱,甚至无法分辨出哪条腿在前那条退在后,要么会因为背面剔除而造成一部分部件无法显示)
我先贴出修改后的shader(基础是Unity自带的Toon shader),shader还没有最终修改完,等修改完毕再做更新。
一、卡通渲染的shader
- Shader "Toon/Basic" {
- Properties {
- _Color ("Main Color", Color) = (.5,.5,.5,1)
- _MainTex ("Base (RGB)", 2D) = "white" {}
- _ToonShade ("ToonShader Cubemap(RGB)", CUBE) = "" { Texgen CubeNormal }
- _Cutoff ("Alpha cutoff", Range(0,1)) = 0.9
- }
- SubShader {
- Tags { "RenderType"="Opaque" }
- Pass {
- Name "BASE"
- Cull Off
- CGPROGRAM
- #pragma vertex vert
- #pragma fragment frag
- #pragma fragmentoption ARB_precision_hint_fastest
- #include "UnityCG.cginc"
- sampler2D _MainTex;
- samplerCUBE _ToonShade;
- float4 _MainTex_ST;
- float4 _Color;