[UnityShader入门精要读书笔记]23.立方体纹理

        在图形学中,立方体纹理(Cubemap)是环境映射的一种实现方法。环境映射可以模拟物体周围的环境,而使用了环境映射的物体看起像是镀了层金属一样反射出周围的环境。

        和之前见的纹理不同,立方体纹理一共包含了6张图像。使用立方体纹理的好处在于,它的时间简单快速,而且得到的效果也比较好。但它也有一些缺点,例如当场景中引入了新的物体、光源,或者物体发生移动时,我们就需要重新生成立方体纹理。除此之外,立方体纹理也仅可以反射环境,但不能反射使用了该立方体纹理的物体本身。这是因为,立方体纹理不能模拟多次反射的结果。由于这样的原因,想要得到令人信服的渲染结果,我们应该尽量对凸面体而不要对凹面体使用立方体纹理(因为凹面体会反射自身)。立方体纹理在实时渲染中有很多应用,最常见的是用于天空盒子(skybox)及环境映射。

       在Unity5中,创建用于环境映射的立方体纹理的方法有三种:第一种方法是直接由一些特殊布局的纹理创建;第二种方法是手动创建一个Cubemap资源,再把6张图赋给它;第三种方法是由脚本生成。

       第一种方法,我们需要提供同一张具有特殊布局的纹理,例如类似立方体展开图的交叉布局、全景布局等。然后,我们只需要把该纹理的Texture Type设置为Cubemap即可,Unity会把剩下的事情做好。

       第二种方法,是在项目中创建一个CubeMap,然后把6张纹理拖拽到它的面板中。

       第三种方法是利用Camera.RenderToCubemap函数来实现。其关键代码如下:

反射

使用了反射效果的物体通常看起来就像镀了层金属。想要模拟反射效果很简单,我们只需要通过入射光线的方向和表面法线方向来计算反射方向,再利用反射方向对立方体纹理采样即可。

       对立方体纹理的采样需要使用CG的texCUBE函数。注意到,在上面的计算中,我们在采样时并没有对i.worldRefl进行归一化操作。这是因为,用于采样的参数仅仅是作为方向变量传递到texCUBE函数的,因此我们没有必要进行一次归一化的操作。然后,我们使用_ReflectAmount来混合漫反射和反射颜色,并和环境光照相加后返回。

       在上面的计算中,我们选择在顶点着色器中计算反射方向。当然,我们也可以选择在片元着色器中计算,这样得到的效果更佳细腻。但是,对于绝大多数人来说这种差别往往是可以忽略不计的,因此 处于性能方面的考虑,我们选择在顶点着色器中计算反射方向。

折射

      折射的物理原理比反射复杂一些。折射的定义:当光线从一种介质斜射入另一种介质,传播方向一般会发生改变。当给定入射角时,我们可以使用斯涅尔定律来计算反射角。

         同样,我们也没有对i.worldRefr进行归一化操作,因为对立方体纹理的采样只需要提供方向即可。最后,我们使用_RefractAmount来混合漫反射颜色和折射颜色,并和环境光照相加后返回。

菲尼尔反射

        在实时渲染中,我们经常会使用菲尼尔反射来根据视角方向控制反射程度。通俗地讲,菲尼尔反射描述了一种光学现象,即当光线照射到物体表面上时,一部分发生反射,一部分进入物体内部,发生折射或散射。被反射的光和入射光之间存在一定比率关系,这个比率关系可以通过菲尼尔等式进行计算。

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值