通过卡通渲染描边shader来学习Unity的Shader写法

  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

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. Shader "Toon/Basic" {  
  2.     Properties {  
  3.         _Color ("Main Color", Color) = (.5,.5,.5,1)  
  4.         _MainTex ("Base (RGB)", 2D) = "white" {}  
  5.         _ToonShade ("ToonShader Cubemap(RGB)", CUBE) = "" { Texgen CubeNormal }  
  6.         _Cutoff ("Alpha cutoff", Range(0,1)) = 0.9  
  7.     }  
  8.   
  9.     SubShader {  
  10.         Tags { "RenderType"="Opaque" }  
  11.         Pass {  
  12.             Name "BASE"  
  13.             Cull Off  
  14.               
  15.             CGPROGRAM  
  16.             #pragma vertex vert  
  17.             #pragma fragment frag  
  18.             #pragma fragmentoption ARB_precision_hint_fastest   
  19.   
  20.             #include "UnityCG.cginc"  
  21.   
  22.             sampler2D _MainTex;  
  23.             samplerCUBE _ToonShade;  
  24.             float4 _MainTex_ST;  
  25.             float4 _Color;  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值