立方体纹理最常见的应用是SkyBox和环境映射
skybox在所有不透明物体之后渲染
创建环境映射的立方体纹理的三种方式:
1.特殊布局的纹理,例如立方体展开图,把TextureType设置为CubeMap即可
2.创建CubeMap,把6张纹理拖拽到它的面板中。
3.Camera.RenderToCubemap,可把从任意位置观察到的场景图存储到6涨图像中
反射:
Reflection
_Cubemap("Cubemap",Cube) = "_Skybox" {}
samplerCUBE _Cubemap;
o.worldRefl= reflect(-viewDir,o.worldNormal);
fixed3 reflection = texCUBE(_Cubemap,i.worldRefl).rgb * _ReflectColor.rgb;
fixed3 color = ambient + lerp(diffuse, reflection, _ReflectAmount) * atten;
折射:
给定入射角,可以用斯涅尔定律(Snell's Law)来计算折射角。
,
为介质的折射率,例如真空为1,玻璃为1.5。
o.worldRefr = refract(-normalize(viewDir),normalize(o.worldNormal),_RefractRatio);
fixed3 refration = texCUBE(_Cubemap,i.worldRefr).rgb * _RefractColor.rgb;
fixed3 color = ambient + lerp(diffuse,refration,_RefractAmount);
菲涅尔反射(Fresnel reflection):
光线照射到物体表面,一部分发生反射,一部分进入物体内部,被反射光与入射光之间存在一定的比例关系,这个比例可以通过菲涅尔等式计算。
Schlick菲涅尔近似等式:
是一个反射系数,用于控制菲涅尔反射的强度。
Empricial菲涅尔近似等式:
bias,scale,p(power)是控制项。