Shader "Custom/BasicRimShader001"
{
Properties{
//主颜色
_MainColor("MainColor",color) = (0.5,0.5,0.5,1)
//漫反射纹理
_TextureDiffuse("Texture Diffuse",2D) = "white" {}
//边缘发光的颜色
_RimColor("Rim color:",color) = (0.2,1,1,1)
//边缘光的强度
_RimColorPower("RimColor Power",Range(0.0,36.0)) = 0.1
//边缘发光强度系数
_RimIntensity("Rim Intensity",Range(0.0,100.0)) = 3
}
SubShader{
//渲染类型为Opaque,不透明 || RenderType Opaque
Tags
{
"RenderType" = "Opaque"
}
pass{
//设置通道名称
Name "ForwardBase"
//设置光照的模式
Tags{
"LightMode" = "ForwardBase"
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
//包含的头文件
#include "AutoLight.cginc"
#include "UnityCG.cginc"
float4 _MainColor;
float4 _LightColor0;
float4 _RimColor;
float4 _TextureDiffuse_ST;
float _RimColorPower;
float _RimIntensity;
sampler2D _TextureDiffuse;
//定数输入的结构
struct VertexInput{
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0; //设置一级纹理信息
};
//设置顶点输出的结构
struct VertexOutput{
//像素位置
float4 pos:SV_POSITION;
//一级纹理
float4 texcoord : TEXCOORD0;
//法向量
float3 normal:NORMAL;
//世界空间的坐标
float4 worldPos : TEXCOORD1;
//创制光源坐标,用于内置的光照
LIGHTING_COORDS(3,4)
};
//顶点着色气
VertexOutput vert(VertexInput Input){
VertexOutput OutPut;
OutPut.pos = mul(UNITY_MATRIX_MVP,Input.vertex);
OutPut.texcoord = Input.texcoord;
//法线要在世界坐标系的位置
OutPut.normal = mul(float4(Input.normal,1.0), unity_WorldToObject) .xyz;
//获取顶点在世界坐标中的位置
OutPut.worldPos = mul(unity_ObjectToWorld,Input.vertex);
return OutPut;
}
//片段着色气
float4 frag(VertexOutput i) : COLOR{
//视角的方向
float3 ViewDirection = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);
// 法线的方向
float NormalDirection = normalize(i.normal);
//光照的方向
float3 LightDirection = normalize(_WorldSpaceLightPos0.xyz);
//计算光照的衰减
//衰减值
float Attenuation = LIGHT_ATTENUATION(i);
//衰减后的颜色值
float3 AttenColor = Attenuation * _LightColor0;
//计算漫反射值
float Ndot = dot(NormalDirection,LightDirection);
float3 Diffuse = max(0.0,Ndot) * AttenColor + UNITY_LIGHTMODEL_AMBIENT.xyz;
//计算自发光参数
//计算边缘强度
half Rim = 1.0 - max(0,dot(i.normal,ViewDirection));
//计算出边缘自发光强度
float3 Emissive = _RimColor.rgb * pow(Rim,_RimColorPower) * _RimIntensity;
//【8.5】计在最终颜色中加入自发光颜色 || Calculate the final color
//最终颜色 = (漫反射系数 x 纹理颜色 x rgb颜色)+自发光颜色 || Final Color=(Diffuse x Texture x rgbColor)+Emissive
float3 finalColor = Diffuse * (tex2D(_TextureDiffuse,TRANSFORM_TEX(i.texcoord.rgb, _TextureDiffuse)).rgb*_MainColor.rgb) + Emissive;
//【8.6】返回最终颜色 || Return final color
return fixed4(finalColor,1);
}
ENDCG
}
}
}