//高级纹理 -反射
Shader "Unity shader book/Chapter 10/Reflection" {
Properties {
_Color("Color Tint",Color)=(1,1,1,1)
_ReflectColor("Reflection Color",Color)=(1,1,1,1)//反射颜色
_ReflectAmount("Reflect Amount",Range(0,1))=1//反射强度
_Cubemap("Refection Cubemap",Cube) = "_Skybox"{}//反射的环境映射纹理
}
SubShader {
Tags{"RenderType"="ForwardBase"}
Pass{
//Tags{"LightMode"="ForwardBase"}
CGPROGRAM
//#pragma mutil_compile_fwdbase
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
#include "AutoLight.cginc"
fixed4 _Color;
fixed4 _ReflectColor;
fixed _ReflectAmount;
samplerCUBE _Cubemap;
struct a2v {
float4 vertex:POSITION;
float3 normal:NORMAL;
};
struct v2f {
float4 pos:SV_POSITION;
float3 worldNormal:TEXCOORD0;
float3 worldPos:TEXCOORD1;
float3 worldViewDir:TEXCOORD2;
float3 worldRefl :TEXCOORD3;
SHADOW_COORDS(4)
};
v2f vert(a2v v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.worldNormal = UnityObjectToWorldNormal(v.normal);
o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
o.worldViewDir = UnityWorldSpaceViewDir(o.worldPos);
o.worldRefl = reflect(-o.worldViewDir,o.worldNormal);//反射函数
TRANSFER_SHADOW(o);
return o;
}
fixed4 frag(v2f i):SV_Target
{
fixed3 worldNormal = normalize(i.worldNormal);
fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
fixed3 worldViewDir = normalize(i.worldViewDir);
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz*_Color.rgb;
fixed diffuse = _LightColor0.rgb*_Color.rgb*max(0,dot(worldNormal, worldLightDir));
//对立方体纹理的采样用texCUBE
fixed3 reflection = texCUBE(_Cubemap, i.worldRefl).rgb*_ReflectColor.rgb;
UNITY_LIGHT_ATTENUATION(atten,i,i.worldPos);
fixed3 color = ambient + lerp(diffuse, reflection, _ReflectAmount)*atten;
//fixed3 color = ambient + diffuse;
return fixed4(color,1.0);
}
ENDCG
}
}
//FallBack "Diffuse"
}