diffuse 加 Emission。
diffuse 在Vertex shader 中计算, Emission在Fragment shader中计算。
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Custom/Lighting/Emission"
{
Properties
{
[Header(Diffuse)]
_Color ("Color", Color) = (1.0, 1.0, 1.0, 1.0)
_Diffuse ("Diffuse value", Range(0, 1)) = 1.0
[Header(Emission)]
_MainTex ("Emissive Map", 2D) = "white" {}
[HDR] _EmissionColor ("Emission Color", Color) = (0,0,0)
_Threshold ("Threshold", Range(0., 1.)) = 1.
}
SubShader
{
Tags { "LightMode"="ForwardBase" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f {
float4 pos : SV_POSITION;
fixed4 col : COLOR0;
float2 uv : TEXCOORD0;
};
fixed4 _Color;
fixed4 _LightColor0;
float _Diffuse;
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert(appdata_base v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
float3 worldNormal = normalize(mul(v.normal, (float3x3)unity_WorldToObject));
float3 lightDir = normalize(_WorldSpaceLightPos0.xyz);
float NdotL = max(0.0, dot(worldNormal, lightDir));
fixed4 diff = _Color * NdotL * _LightColor0 * _Diffuse;
o.col = diff;
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
//o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw; //和上同
return o;
}
float4 _EmissionColor;
float _Threshold;
fixed4 frag(v2f i) : SV_Target {
fixed3 emi = tex2D(_MainTex, i.uv).r * _EmissionColor.rgb * _Threshold;
i.col.rgb += emi;
return i.col;
}
ENDCG
}
}
}
其中需要简单介绍下的是
1. TRANSFORM_TEX主要作用是拿顶点的uv去和材质球的tiling和offset作运算, 确保材质球里的缩放和偏移设置是正确的。
下面这两个函数是等价的。
o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);
o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
2. 在unity5.6以上版本中,shader中的UNITY_MATRIX_MVP将会被UnityObjectToClipPos替代,以后我们在写顶点函数时就是这样的
v2f vert(appdata v) { v2f o; //unity5.6以前的写法 //o.vertex = mul(UNITY_MATRIX_MVP,v.vertex); //unity5.6以后的写法 o.vertex = UnityObjectToClipPos(v.vertex); return o; }
相应的,UNITY_MATRIX_VP,UNITY_MATRIX_P都有对应的封装方法UnityWorldToClipPos,UnityViewToClipPos
3.
appdata_base: 顶点由位置、法线和一个纹理坐标构成。
appdata_tan: 顶点由位置、切线、法线和一个纹理坐标构成。
appdata_full: 顶点由位置、切线、法线、两个纹理坐标以及颜色构成。