单独使用一个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. 算法基础知识科普:8大搜索算法之二叉搜索树(下)
  2. python画代码-一行Python代码画心型
  3. 微服务实战(二):使用API Gateway--转
  4. 路径前缀是什么意思_Trie 树是什么样的数据结构?有哪些应用场景?
  5. Java中的功能性FizzBu​​zz Kata
  6. configure: error: Curl library not foun
  7. codeblocks使用技巧
  8. 物化视图实践(1)----实现远程数据同步
  9. 细数python标准库中低调的模块
  10. Python 面向对象 —— 多重继承
  11. Enyim.Caching 客户端配置及示例
  12. linux下iptables详解
  13. 十年Smartbi项目经理:BI应用在银行业的发展历程和展望
  14. MATLAB--从正弦波转换为方波(验证傅里叶级数)
  15. 乔布斯鲜为人知的私生活:低调、曾经多情
  16. LINUX中的七种文件类型
  17. 苹果隔空传递 Android,极客修:苹果:我会隔空投送,你呢?安卓:切
  18. 一枝独秀 BugkuCTF-杂项-MISC
  19. 网页防篡改技术的前世与今生
  20. 计算机作品画图板软件四年级,四年级计算机《用画图软件画画》

热门文章

  1. 方舟手游服务器配置文件,方舟创建服务器所需配置 | 手游网游页游攻略大全
  2. 公专网集群对讲系统方案——城管
  3. 计算机专业的人的优势
  4. Android* 操作系统应用程序远程调试
  5. 卷积神经网络和神经网络,单层卷积神经网络
  6. 网络上很火的“万词霸屏”到底好不好?是什么原理
  7. pygame小游戏--接弹珠
  8. 1、综合布线工程常用设备材料介绍及施工注意事项
  9. Q45:圆圈中最后剩下的数字
  10. 11.解构赋值一览。