CubeMap

立方体纹理最常见的应用是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)来计算折射角。

\eta 1\sin \theta 1 = \eta 2\sin \theta 2\eta 为介质的折射率,例如真空为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菲涅尔近似等式:

F_{Schlick}(v,n) = F_{0}  + (1 - F_{0})(1 - v.n)^5

F_{0} 是一个反射系数,用于控制菲涅尔反射的强度。

Empricial菲涅尔近似等式:

F_{Empricial}(v,n) = max(0,min(1,bias + scale \times  (1-v.n)^p ))

bias,scale,p(power)是控制项。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容