反射 (reflection)
float3 refleDir=reflection(-viewDir,worldNormal)
float3 refleColor=texCUBE(_Cube,refleDir)
折射(refraction)
float3 refraDir=refraction(-viewDir,worldNormal,_RefractionRate)
float3 refraColor=texCUBE(_Cube,refraDir)
菲涅尔反射(随着观察角度变化而变化的反射)
公式:float fresnel=_FresnelScale+(1-_FresnelScale)*Pow(1-dot(viewDir,worldNormal),_FresnelPower)
变体:float fresnel=max(0,min(1,refraction+_FresnelScale*pow(1-dot(viewDir,worldNormal),_FresnelPower))) 用于风格化渲染
float3 finColor=lerp(ambientColor,reflection,fresnel)
渲染纹理
1.镜面效果
renderTextrue + camera + 主纹理(rendertextrue)uv.x取反
2.玻璃效果
需要半透
tag("Queue"="Transparent" RenderType="TrnasParent")
ZWrite=Off
Blend ScrAlpha OneMinuxScrAlpha
_Distortion("Distortion",Range(0,100))=10
使用GrabPass("_RefractionTex") 抓取屏幕图片做折射 名字固定的
sampler2D _RefractionTex
float3 _RefractionTex_TexelSize
v2f vert(appdate i)
{
o.pos=UnityObjectToClipPos(i.vertex)
o.scrPos=ComputeGrabScreenPos(o.pos)
}
需要法线纹理,以纹理来做折射偏移
float2 offset=normal.xy*_RefractionTex_TexelSize.xy*_Distortion
scrPos.xy+=offset
float3 refractionColor = tex2D(_RefractionTex,scrPos.xy/scrPos.w)
lerp(diff,refractionColor,_Refraction)
纹理动画
_FrameTex("FrameTex",2d)="white"
_PlaySpeed("PlaySpeed",float)=1
循环纹理动画
frac(float2(xSpeed,ySpeed)*_Time,y)
frac取数据小数部分 = x-floor(x)