// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Unity Shaders Book/Chapter 10/Fresnel"
{
Properties
{
_Color("Color Tint",Color) = (1,1,1,1)
_FresnelScale("Fresnel Scale",Range(0,1)) = 0.5
_Cubemap("Refraction Cubemap",Cube) = "_Skybox"{}
}
SubShader
{
Tags{ "RenderType" = "Opaque" "Queue" = "Geometry" }
Pass
{
Tags{ "LightMode" = "ForwardBase" }
CGPROGRAM
//确保光源变量可以被正确赋值
#pragma multi_compile_fwdbase
#pragma vertex vert
#pragma fragment frag
//包含引用的内置文件
#include "Lighting.cginc"
#include "AutoLight.cginc"
//声明properties中定义的属性
fixed4 _Color;
fixed _FresnelScale;
//声明cubemap
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;
fixed3 diffuse = _LightColor0.rgb * _Color.rgb * saturate(dot(worldNormal, worldLightDir));
//利用反射方向来对立方体纹理采样
fixed3 reflection = texCUBE(_Cubemap, i.worldRefl).rgb;
//计算菲涅尔反射
//菲涅尔近似等式
fixed fresnel = _FresnelScale + (1 - _FresnelScale) * pow(1 - dot(worldViewDir, worldNormal), 5);
UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);
//混合漫反射颜色与反射颜色
fixed3 color = ambient + lerp(diffuse, reflection, saturate(fresnel)) * atten;
return fixed4(color, 1.0);
}
ENDCG
}
}
Fallback"Reflective/VertexLit"
}
UnityShader中级篇——菲涅尔反射
最新推荐文章于 2024-06-25 15:15:00 发布