Unity Shader 顶点片段Shader实现(纹理法线贴图)
Shader "Custom/MyLastShader1"
{
Properties
{
_MainColor("MainColor",COLOR) = (1,1,1,1)
_NorTexture("NormalTexture",2D) = "white"{}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100
Pass
{
Tags{"LightMode"="ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
float4 _MainColor;
sampler2D _NorTexture;
struct v2f
{
float4 vertex : SV_POSITION;
float3 nor:NORMAL;
float4 pos : POSITION1;
float3 tan:POSITION2;
float2 nortexcoord:TEXCOORD0;
};
v2f vert (appdata_tan v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.nor = v.normal;
o.pos = v.vertex;
TANGENT_SPACE_ROTATION;
o.tan = mul(rotation,WorldSpaceLightDir(v.vertex));
o.nortexcoord = v.texcoord.xy;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
float4 col = unity_AmbientSky * 2;
float3 N = normalize(UnpackNormal(tex2D(_NorTexture,i.nortexcoord)));
float3 L = normalize(i.tan);
float ndot = saturate(dot(L,N));
col += _LightColor0 * ndot * _MainColor;
float3 worldPos = mul(unity_ObjectToWorld,i.pos);
col.rgb += Shade4PointLights(unity_4LightPosX0,unity_4LightPosY0,unity_4LightPosZ0,
unity_LightColor[0],unity_LightColor[1],unity_LightColor[2],unity_LightColor[3],
unity_4LightAtten0,
worldPos,N);
return col;
}
ENDCG
}
Pass
{
Tags{"LightMode"="ForwardAdd"}
Blend one one
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc"
float4 _MainColor;
sampler2D _NorTexture;
struct v2f
{
float4 vertex : SV_POSITION;
float3 nor:NORMAL;
float4 pos : POSITION1;
float3 tan:POSITION2;
float2 nortexcoord:TEXCOORD0;
};
v2f vert (appdata_tan v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.nor = v.normal;
o.pos = v.vertex;
TANGENT_SPACE_ROTATION;
o.tan = mul(rotation,WorldSpaceLightDir(v.vertex));
o.nortexcoord = v.texcoord.xy;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
float4 col = unity_AmbientSky * 2;
float3 N = normalize(UnpackNormal(tex2D(_NorTexture,i.nortexcoord)));
float3 L = normalize(i.tan);
float ndot = saturate(dot(L,N));
float t = 0;
if(_WorldSpaceLightPos0.w!=0){
t = 1.0/length(i.tan);
}
col += _LightColor0 * ndot * _MainColor * t;
return col;
}
ENDCG
}
}
}