本文参考博客Unity Toon Shader 卡通着色器(一):卡通着色
这是我实现的最后效果
我们先一步一步来
最开始我们实现一个只有漫反射效果的Shader,效果和代码如下

Shader "Unlit/ToonLearn"
{Properties{_MainTex ("Texture", 2D) = "white" {}_Color("Color",Color)=(1,1,1,1)}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{Tags {"LightMode"="ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;float3 normal:NORMAL;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;float3 normal:TEXCOORD1;};sampler2D _MainTex;float4 _MainTex_ST;float3 _Color;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);o.normal=mul(v.normal,(float3x3)unity_WorldToObject);return o;}fixed4 frag (v2f i) : SV_Target{fixed3 lightDir=normalize(_WorldSpaceLightPos0.xyz);float3 normal=normalize(i.normal);float NdotL=saturate(dot(normal,lightDir));fixed3 albedo = tex2D(_MainTex, i.uv)*_Color.rgb;fixed3 diffuse= albedo*_LightColor0.rgb*NdotL;float4 finalColor=float4(diffuse,1);return finalColor;}ENDCG}}
}

这就是一个比较简单的漫反射着色器
接下来把色阶降到两个

代码如下

 _RampThreshold("Ramp Threshold",Range(0,1))=0.5_RampSmooth("Smooth Threshold",Range(0,1))=0.1......fixed3 ramp=smoothstep(_RampThreshold-_RampSmooth*0.5,_RampThreshold+_RampSmooth*0.5,NdotL);fixed3 albedo = tex2D(_MainTex, i.uv)*_Color.rgb;fixed3 diffuse= albedo*_LightColor0.rgb*ramp;

在这里我们引入_RampThreshold,当NdotL>_RampThreshold,ramp=1,当NdotL<_RampThreshold,ramp=0,
同时我们引入_RampSmooth作为平滑度,同时使smoothstep进行平滑过渡,这篇博客对smoothstep的介绍就挺好的Shader smoothstep使用
接下来我们可以用颜色叠加来作为阴影和亮部,于是引入了_SColor和_HColor,挑一个好看的参数。

反正比黑漆漆要好看得多,以下是代码

 _HColor ("Highlight Color", Color) = (0.8, 0.8, 0.8, 1.0)_SColor ("Shadow Color", Color) = (0.2, 0.2, 0.2, 1.0)..._SColor=lerp(_HColor,_SColor,_SColor.a);float3 rampColor=lerp(_SColor.rgb,_HColor.rgb,ramp);fixed3 diffuse= albedo*_LightColor0.rgb*rampColor;

最后我们需要增加一些高光和边缘光,效果如下(只是高光计算有点问题)

最后的代码

Shader "Unlit/ToonLearn"
{Properties{_MainTex ("Texture", 2D) = "white" {}_RampThreshold("Ramp Threshold",Range(0,1))=0.5_RampSmooth("Smooth Threshold",Range(0,1))=0.1_Color("Color",Color)=(1,1,1,1)_HColor ("Highlight Color", Color) = (0.8, 0.8, 0.8, 1.0)_SColor ("Shadow Color", Color) = (0.2, 0.2, 0.2, 1.0)_SpecularColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 1)_SpecThreshold ("Specular Threshold", Range(0, 1)) = 0.5_SpecSmooth ("Specular Smooth", Range(0, 1)) = 0.1_Shininess ("Shininess", Range(0.001, 10)) = 0.2_RimColor ("Rim Color", Color) = (0.8, 0.8, 0.8, 0.6)_RimThreshold ("Rim Threshold", Range(0, 1)) = 0.5_RimSmooth ("Rim Smooth", Range(0, 1)) = 0.1}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{Tags {"LightMode"="ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;float3 normal:NORMAL;};struct v2f{float2 uv : TEXCOORD0;float4 vertex : SV_POSITION;float3 normal:TEXCOORD1;};sampler2D _MainTex;float4 _MainTex_ST;float4 _Color;float4 _SColor;float4 _HColor;float _RampThreshold;float _RampSmooth;float4 _SpecularColor;float _SpecThreshold;float _SpecSmooth;float _Shininess;float4 _RimColor;float _RimThreshold;float _RimSmooth;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);o.normal=mul(v.normal,(float3x3)unity_WorldToObject);return o;}fixed4 frag (v2f i) : SV_Target{fixed3 lightDir=normalize(_WorldSpaceLightPos0.xyz);fixed3 viewDir=normalize(_WorldSpaceCameraPos.xyz);fixed3 halfDir=normalize(lightDir+viewDir);float3 normal=normalize(i.normal);float NdotL=saturate(dot(normal,lightDir));float NdotH=saturate(dot(normal,halfDir));float NdotV=saturate(dot(normal,viewDir));fixed3 ramp=smoothstep(_RampThreshold-_RampSmooth*0.5,_RampThreshold+_RampSmooth*0.5,NdotL);fixed4 albedo = tex2D(_MainTex, i.uv)*_Color;_SColor=lerp(_HColor,_SColor,_SColor.a);float3 rampColor=lerp(_SColor.rgb,_HColor.rgb,ramp);fixed3 diffuse= albedo.rgb*_LightColor0.rgb*rampColor;float gloss=albedo.a;float spec=pow(NdotH,_Shininess*128)*gloss;spec=smoothstep(_SpecThreshold-_SpecSmooth*0.5,_SpecThreshold+_SpecSmooth*0.5,spec);fixed3 specular=_SpecularColor.rgb*_LightColor0.rgb*spec;float rim=(1-NdotV)*NdotL;rim=smoothstep(_RimThreshold-_RimSmooth*0.5,_RimThreshold+_RimSmooth*0.5,rim);fixed3 rimColor=_RimColor.rgb*_LightColor0.rgb*_RimColor.a*rim;float4 finalColor=float4(diffuse+specular+rimColor,1);return finalColor;}ENDCG}}
}

这就是全部了,感谢你的阅读,如有错误,欢迎指正。

Unity Shader 实现卡通渲染效果相关推荐

  1. Unity shader 关于卡通渲染阴影闭塞的实现

    想实现一个胸部的动态阴影效果 这种 推测应该是,AO贴图 + 边缘光的算法 + 梯度图lerp.我没用AO贴图(嫌麻烦

  2. Unity Shader · 科技感矩阵效果

    Unity Shader · 科技感矩阵效果 前言 最近想要做一个次世代卡通渲染(伪),选的是崩崩崩的小八(我最喜欢小八了). 先放几张截图,等全部做完之后再分享用到的一些技术叭. 赶紧做完发B站,等 ...

  3. 米哈游贺甲:如何实现次世代卡通渲染效果?

    在5月12日Unite2017开发者大会上,米哈游技术总监兼美术指导贺甲进行了主题为次世代卡通渲染的演讲.一下为详细分享内容: 大家好,首先自我介绍一下,我叫贺甲,在米哈游担任技术总监和美术指导工作, ...

  4. Unity Shader·屏幕抖音效果

    Unity Shader·屏幕抖音效果 前言 最近在做一个新的MMD(用Unity来实现),其中用到了一些好看的渲染技术在这里分享一下. 视频链接 https://www.bilibili.com/v ...

  5. Unity Shader学习:油画效果

    Unity Shader学习:油画效果 油画效果在学习浅墨大神的文章时看到的比较有趣,但是原文中也没详细的算法介绍如何实现,这里就先直接拿来用吧,UI和屏幕后处理都可以用,算法也看的不是很明白,好像是 ...

  6. (二十二)unity Shader——————非真实感渲染:上篇(卡通风格的渲染)

    尽管游戏渲染一般都是以照相写实主义作为主要目标,但也有许多游戏使用了非真实感渲染(NPR)的方法来渲染游戏画面.非真实感的一个主要目标是,使用一些方法使得画面和某些特殊的绘画风格相似的效果,例如卡通. ...

  7. Unity制作二次元卡通渲染角色材质——2、色阶化光影的多种做法对比

    Unity制作二次元材质角色 回到目录 大家好,我是阿赵. 这里继续讲二次元角色渲染.之前说过,最基本的卡通渲染,包含了色阶化光影和描边二个元素.所以这里先来说一下色阶化光影的多种做法对比. 一.光照 ...

  8. Unity Shader 实现透明护盾效果

    这是大致的效果图,图片压得有点糊.我参考了本篇博客 Unity shader护盾特效. 这是原博客展示的图片: 本例采用了特殊的模型与贴图,原博客里有视频链接的教程,从模型到贴图. 以下是代码 // ...

  9. Unity制作二次元卡通渲染角色材质——4 、内外描边和细节添加

    Unity制作二次元材质角色 回到目录 大家好,我是阿赵. 这里继续讲二次元角色材质.这次打算讲一下描边和细节的添加. 一.外描边 外描边的做法也不止一种,比如后处理方法的偏导数ddx/ddy之类的, ...

最新文章

  1. Mysql 安装服务无法启动解决方案与使用的一般使用指令
  2. python1000个常用代码-Python常用代码(1)
  3. 程序员面试什么最重要
  4. php中的foreach和js中的foreach的用法和区别
  5. 大学计算机人工智能知识点,人工智能知识点大集锦
  6. Objective-C基础笔记(3)OC的内存管理
  7. es修改type名称_ElasticSearch如何修改索引字段
  8. linux创建sudo用户_Linux终极指南-创建Sudo用户
  9. 数学难题html5小游戏答案,小学数学难题讲解及答案
  10. java stream optional_java成神之——Stream和Optional
  11. python黑洞_史上第一张黑洞照片是用Python合成的?
  12. CSharp for Jupyter Notebook
  13. 一套通用的后台管理系统Base Admin 前端:layui 后端:java
  14. java输出当前文件所在路径
  15. Ubuntu Server 安装桌面untiy
  16. unity Scene窗口的任意比例放大和缩小
  17. Oracle数据库下载与安装(Windows)
  18. HMS Core Insights第三期直播预告—— 当我们在谈论App的时候,我们还可以谈论什么?
  19. js试题及答案(五)
  20. html文件内容重叠,html – CSS:页脚重叠内容,其他故障

热门文章

  1. YDOOK :STM32 : 什么是波特率?波特率Baudrate 的定义
  2. 兼容iPhone5分辨率的简单方法
  3. 一款不错的开源屏幕(窗口)录制软件 CamStudio
  4. FreeCAD错误:没有激活的实体 解决办法
  5. SpringBoot整合华为云OBS实现文件上传下载
  6. Springboot整合Lombok
  7. java camel,java – 返回基础知识:Apache Camel路由和直接组件
  8. java获取项目在tomcat中路径_java获取项目地址或tomcat绝对地址
  9. rz工具的安装和使用
  10. html div将页面划分,css+div网页布局