单独使用一个Pass进行描边。

需先在Properties中定义:
_Outline(“outline”,Range(0,0.2)) = 0.003
_OutlineColor(“outline color”,Color)=(0,0,0,0)

Pass//描边通道
{Name "Outline"Cull FrontCGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"float _Outline;float4 _OutlineColor;struct v2f{float4 vertex:SV_POSITION;};v2f vert(appdata_base v){v2f o;//模型空间法线外拓v.vertex.xyz += v.normal*_Outline;o.vertex = UnityObjectToClipPos(v.vertex);//视角空间法线外拓//float4 pos= mul(UNITY_MATRIX_V, mul(unity_ObjectToWorld, v.vertex));//模型顶点坐标转换到视角坐标//float3 normal = normalize(mul((float3x3)UNITY_MATRIX_IT_MV, v.normal));//得到视角坐标的法线//pos = pos + float4(normal,0) * _Outline;//o.vertex= mul(UNITY_MATRIX_P, pos);//从视角空间转换到裁剪空间//裁剪空间法线外拓//o.vertex = UnityObjectToClipPos(v.vertex);//float3 normal = normalize(mul((float3x3)UNITY_MATRIX_IT_MV, v.normal));//得到视角坐标的法线//float2 viewNormal = TransformViewToProjection(normal.xy);// 转换 视图空间 到 投影空间//o.vertex.xy += viewNormal * _Outline;return o;}fixed4 frag(v2f i) :SV_Target{return _OutlineColor;}ENDCG
}

使用渐变纹理,更卡通化。即改变光照为阶梯强弱效果
主要代码:

float difLight = dot(worldNormal, lightDir)*0.5 + 0.5;
difLight = smoothstep(0, 1, difLight);
float toon = floor(difLight*_Step) / _Step;
difLight = lerp(difLight, toon, _ToonEffect);

接下来是使用法线贴图,使效果更真实。(从链接进入)

然后实现积雪效果,使表面附上一层雪
主要代码:

if (dot(worldNormal, _SnowDir.xyz) > lerp(1, -1, _Snow))
{color.rgb = _SnowColor.rgb;
}

最后展示总的卡通积雪场景的shader代码:

Shader "MyShader/Scene"
{Properties{ _SnowColor("snow color",Color) = (1,1,1,1)_Snow("snow level",Range(0,1)) = 0.5_SnowDir("snow dir",Vector) = (0,1,0)_MainTex("Texture", 2D) = "white" {}_Diffuse("diffuse",Color) = (1,1,1,1)_Outline("out line",Range(0,0.2)) = 0.1_OutlineColor("outline color",Color) = (1,1,1,1)_Step("step",Range(1,30)) = 1_ToonEffect("toon effect",Range(0,1)) = 0.5_BumpMap("bump map",2D) = "bump"_BumpScale("bump scale",float) = 1}SubShader{Tags { "RenderType"="Opaque" }LOD 100//这里是调用了其他地方的shader中的一个Pass,代码即为最上面的那个描边代码。//也可将上面的那个Pass代码复制进这里面使用。UsePass "MyShader/NewShader/Outline"Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile __ SNOW_ON#include "UnityCG.cginc"#include "Lighting.cginc"struct v2f{float4 vertex : SV_POSITION;float4 uv : TEXCOORD0;float4 TtoW0:TEXCOORD1;float4 TtoW1:TEXCOORD2;float4 TtoW2:TEXCOORD3;};sampler2D _MainTex;float4 _MainTex_ST;float4 _Diffuse;float _Step;float _ToonEffect;sampler2D _BumpMap;float4 _BumpMap_ST;float _BumpScale;float4 _SnowColor;float4 _SnowDir;float _Snow;v2f vert (appdata_tan v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex);o.uv.zw = TRANSFORM_TEX(v.texcoord, _BumpMap);float3 worldPos = mul(unity_ObjectToWorld, v.vertex);float3 worldNormal = UnityObjectToWorldNormal(v.normal);float3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz);float3 worldBinormal = cross(worldNormal, worldTangent)*v.tangent.w;o.TtoW0 = float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x);o.TtoW1 = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y);o.TtoW2 = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z);return o;}fixed4 frag (v2f i) : SV_Target{fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;float3 worldPos = float3(i.TtoW0.w, i.TtoW1.w, i.TtoW2.w);fixed3 lightDir = normalize(UnityWorldSpaceLightDir(worldPos));fixed4 packedNormal = tex2D(_BumpMap, i.uv.zw);fixed3 tangentNormal = UnpackNormal(packedNormal);tangentNormal.xy *= _BumpScale;float3 worldNormal = float3(dot(i.TtoW0.xyz, tangentNormal), dot(i.TtoW1.xyz, tangentNormal), dot(i.TtoW2.xyz, tangentNormal));float difLight = dot(worldNormal, lightDir)*0.5 + 0.5;difLight = smoothstep(0, 1, difLight);float toon = floor(difLight*_Step) / _Step;difLight = lerp(difLight, toon, _ToonEffect);fixed4 albedo = tex2D(_MainTex, i.uv.xy);fixed3 diffuse = _LightColor0.rgb*albedo.rgb*_Diffuse.rgb*difLight;fixed4 color = fixed4(ambient + diffuse, 1);#if SNOW_ONif (dot(worldNormal, _SnowDir.xyz) > lerp(1, -1, _Snow)){color.rgb = _SnowColor.rgb;}#endifreturn color;}ENDCG}}
}

卡通积雪效果已经完成了,但我们希望在外界一键积雪或者一键关闭积雪,我们可以使用宏定义,即为上面代码中的
#pragma multi_compile __ SNOW_ON

#if SNOW_ON
#endif

默认是false的,即默认不积雪。
此时我们使用编辑器扩展,先创建Editor文件夹,然后创建一个C#脚本,在代码中写入:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;public class Snow
{private static string SNOW_ON = "SNOW_ON";[MenuItem("Tools/Shader/打开或关闭雪的宏")]public static void OpenOrCloseSnow(){if(Shader.IsKeywordEnabled(SNOW_ON)){Shader.DisableKeyword(SNOW_ON);}else{Shader.EnableKeyword(SNOW_ON);}}
}

等待编译完成后,在Unity的菜单栏上就出现了Tools工具,点击Tools/Shader/打开或关闭雪的宏,就可以打开或者关闭雪了。

shader 卡通积雪场景相关推荐

  1. 这些C4D创意卡通色彩场景,简直酷到爆炸!

    Cinema 4D 应用广泛,在广告.电影.工业设计.等方面都有出色的表现,例如影片<阿凡达>有花鸦三维影动研究室中国工作人员使用Cinema 4D制作了部分场景,在这样的大片中看到C4D ...

  2. 20X36 FCPX插件卡通人物角色场景解说转场图标MG动画元素包 Brightly V3

    20X36 FCPX插件卡通人物角色场景解说转场图标MG动画元素包 Brightly V3 [插件介绍] 这是最新的Brightly V3版本,最完整的mg动画工具包,为最终切割亲X和苹果运动!创建动 ...

  3. Unity Shader卡通渲染 · 高清渲染管线·HDRP

    Unity Shader卡通渲染 · 高清渲染管线·HDRP 前言 最近在研究HDRP管线中的卡通渲染,就想着能不能把官方的UCTS移植到HDRP管线里面去,说干就干,到昨天晚上上传了github,今 ...

  4. Unity Shader 卡通渲染 模型描边之退化四边形

    目录 前言 一.基于空间的边缘检测算法 二.退化四边形 三.Unity中的CommandBuffer和ComputeBuffer 四.构成描边的简单实例 五.模型描边的实现 前言 之前写了一篇< ...

  5. Unity Shader 卡通渲染 实时模型动画描边的研究

    前言 卡通渲染也叫非真实感渲染(英文简写:NPR),"描边"在图形学和数字图像里都叫边缘检测.因此你可以在很多文献网站上面找到很多这类文献,但最后我发现基于图形学使用的方式基本都是 ...

  6. unity shader卡通场景

    Shader "Unlit/卡通场景shader" {Properties{_MainTex ("Texture", 2D) = "white&quo ...

  7. Unity Shader 卡通渲染 (一):仿塞尔达荒野之息 Shader(简易版)

    温馨提示: 本系列文章面向那些 Shader 刚刚入门,想寻求进一步提升的群体,如果对 Shader 一无所知的话,建议自行搜索其他 Shader入门教程观看学习,再食用本系列文章. 前言: 说起卡通 ...

  8. Unity Shader 卡通渲染 (三):仿塞尔达荒野之息 Shader(顶点色控制细节)

    上一篇传送门: https://blog.csdn.net/qq_27534999/article/details/100925621 顶点色在卡通渲染中有挺多应用,本篇会在上一篇的基础上,运用模型顶 ...

  9. Unity Toon Shader 卡通着色器(一):卡通着色

    一直对非真实感渲染 (Non-Photorealistic Rendering) 很感兴趣,正好发现某社出的新游戏中可以选择真实质感或卡通质感,所以想试试在 Unity 里实现一下卡通着色器. 卡通渲 ...

最新文章

  1. 《将要淘汰的八种人》读后感
  2. python 打印皮卡丘_Python到底是什么?学姐靠它拿了5个offer
  3. Java 判断一个字符串是否为数字类型
  4. 产品经理提升修炼的方法
  5. java枚举使用示例
  6. Linux下socket最大连接数 ulimit -n 最大值修改
  7. centos6.5 安装hadoop1.2.1亲测版
  8. Linux下openSSL安装并颁发证书
  9. HDU 1160 FatMouse#39;s Speed DP题解
  10. eclipse注释模板
  11. linux安装挂载samba,【Linux系列】Centos7安装Samba并将工作区挂载到win(八)
  12. 用 C# 做人脸检测(基于EmguCV)
  13. 手把手教你清除WIN7的C盘垃圾
  14. getParameterValues 和 getParameter区别
  15. GoLang的安装和使用
  16. 女生可以做软件测试吗?
  17. POI读写Excel演练
  18. %在c语言中起什么作用
  19. Note For Linux By Jes(3)-Linux文件与目录管理
  20. 使用canvas绘制一个动态的表盘

热门文章

  1. Van der Waerden 定理
  2. 长假回来总是困?这招教你避免!
  3. The Ludlows
  4. 【GOLDWAVE 信号源】
  5. Jupyter debugger安装
  6. Codeforces Round #517 Div.2 FST神场
  7. 公务员备考(二十) 申论
  8. rabbitmq生产者和消费者
  9. 百事可乐高级副总裁兼Tom Trainer:领导力、IT
  10. 我的世界金钱mysql_我的世界交易变方便了 点券插件分享