// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Unity Shaders Book/Chapter 10/Refraction"
{
Properties
{
_Color("Color Tint",Color) = (1,1,1,1)
_RefractColor("Refraction Color",Color) = (1,1,1,1)
_RefractAmount("Refraction Amount",Range(0,1)) = 1
//不同介质的透射比
_RefractRatio("Refraction Ratio",Range(0.1,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;
fixed4 _RefractColor;
fixed _RefractAmount;
fixed _RefractRatio;
//声明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 worldRefr: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.worldRefr = refract(-normalize(o.worldViewDir), normalize(o.worldNormal),_RefractRatio);
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 refraction = texCUBE(_Cubemap, i.worldRefr).rgb * _RefractColor.rgb;
UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);
//混合漫反射颜色与折射颜色
fixed3 color = ambient + lerp(diffuse, refraction, _RefractAmount) * atten;
return fixed4(color, 1.0);
}
ENDCG
}
}
Fallback"Refractive/VertexLit"
}
UnityShader中级篇——折射
最新推荐文章于 2024-05-09 11:07:23 发布