1.卡通渲染
//卡通渲染
//轮廓线渲染原理:渲染物体背面后向外拓展
//轮廓线弃用方案:根据视线与物体法线的夹角大小判断轮廓。理由:应用于正方体等规整物体上时效果极差
Shader "MyToon/Toon-Fragment" {
Properties {
_MainTex ("MainTex", 2D) = "white" {}
_Ramp ("Ramp Texture", 2D) = "white" {}
_Tooniness ("Tooniness", Range(0.1,20)) = 4
_Outline ("Outline", Range(0,0.1)) = 0.01
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
//下面是渲染背面的pass
Pass {
Tags { "LightMode"="ForwardBase" }
Cull Front//剔除正面
Lighting Off
ZWrite On
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fwdbase
#include "UnityCG.cginc"
float _Outline;
struct a2v
{
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct v2f
{
float4 pos : POSITION;
};
v2f vert (a2v v)
{
v2f o;
float4 pos = mul( UNITY_MATRIX_MV, v.vertex); //顶点位置从模型空间转换到观察空间(摄像机空间)
float3 normal = mul(v.normal, (float3x3)UNITY_MATRIX_T_MV);//将法线(向量)从模型空间变换到观察空间。
normal.z = -0.5;//Z方向的值扁平化(使其是一个较小的定值),防止喧宾夺主,挡住正面的渲染结果(不能关闭深度写入来解决)
//将法线与顶点转到观察空间也是为了这一步的扁平化。否则不需要(根据法线与视线夹角的那个方法)
pos = pos + float4(normalize(normal),0) * _Outline;//v.vertex沿着v.normal的方向扩展_Outline倍
o.pos = mul(UNITY_MATRIX_P, pos);//把新的位置转换到投影坐标系中
return o;
}
float4 frag(v2f i) : COLOR
{
return float4(0, 0, 0, 1); //将背面渲染成黑色就返回
}