(十四)unity shader之——————高级纹理之立方体纹理cubemap(天空盒skybox、反射、折射、菲涅耳反射)

立方体纹理在图形学中,立方体纹理(cubemap)是环境映射的一种实现方法,环境映射可以模拟物体周围的环境,而使用了环境映射的物体可以看起来像镀了层金属一样反射出周围的环境。和之前见到的纹理不同,立方体纹理一共包含了6张图像,这些图像对应了一个立方体的6个面。立方体的每个面表示沿着世界空间下的轴向观察所得的图像,那么怎么对这样的纹理采样呢?和之前使用的二维纹理坐标不同,对立方体纹理采样我们...
摘要由CSDN通过智能技术生成

立方体纹理

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

和之前见到的纹理不同,立方体纹理一共包含了6张图像,这些图像对应了一个立方体的6个面。立方体的每个面表示沿着世界空间下的轴向观察所得的图像,那么怎么对这样的纹理采样呢?和之前使用的二维纹理坐标不同,对立方体纹理采样我们需要提供一个三维的纹理坐标,这个三维纹理坐标表示了我们在世界空间下的一个3D方向。这个方向的矢量从立方体的中心出发,当它向外部延伸时就会和立方体的6个纹理之一发生相交。而采样得到的结果就是由该交点计算而来的。下图给出了使用方向矢量对立方体纹理的采样过程。

使用立方体纹理的好处在于实现简单快速,而且得到的效果也比较好。但也有一些缺点,例如当场景中引入了新的物体、光源,或者物体发生移动时,我们就需要重新生成立方体纹理。除此以外,立方体纹理也仅可以反射环境,但不能反射使用了该立方体纹理的物体本身。这是因为立方体纹理不能模拟多次反射的结果,例如两个金属球互相反射的情况(事实上unity5引入的全局光照系统允许实现这一的自反射效果)。由于这一的原因,想要得到好的渲染结果,我们应该尽量对凸面体而不要对凹面体使用立方体纹理(因为凹面体会反射自身)

立方体纹理在实时渲染中有很多应用,最常见的是用于天空盒子(Skybox)以及环境映射。

一、天空盒子

天空盒子是游戏中用于模拟背景的一种方法,用来模拟天空的(仍然可以用它模拟室内灯背景)的一个盒子,当我们在场景中使用了天空盒子时,整个场景被包围在一个立方体内。这个立方体的每个面使用的技术就是立方体纹理映射技术。

使用的话只需要创建一个Skybox材质,这里选择unity自带的Skybox/6 Sided shader,然后选择对应的6张纹理,注意位置要准确对应,为了让天空盒子正常渲染,需要把这6张纹理的Wrap Mode设置为Clamp,以防止接缝处出现不匹配的现象

使用天空盒:

新建场景,在Window->Lighting菜单中,把SkyboxMat赋给Skybox选项,为了让摄像机正常显示天空盒,还需要保证渲染场景的摄像机Camera组件中的Clear Flags 被设置为Skybox

 

需要注意,在Window->Lighting->Skybox中设置的天空盒会应用于该场景中的所有摄像机,如果希望某些摄像机可以使用不同的天空盒子,可以通过向该摄像机添加Skybox组件来覆盖掉之前的设置。也就是说可以在摄像机上单击Component->Rendering->Skybox来完成对场景默认天空盒子的覆盖。

在unity中天空盒子是在所有不透明物体之后渲染的,而其背后使用的网格是一个立方体或一个细分后的球体。

二、创建用于环境映射的立方体纹理

除了天空盒子,立方体纹理最常见的用处是用于环境映射,通过这种方法可以模拟出金属质感的材质。在unity5中,创建用于环境映射的立方体纹理的方法有三种:第一种方法是直接由一些特殊布局的纹理创建,第二种方法是手动创建一个cubemap资源,再把6张图赋给他,第三种是由脚本生成

1.如果使用第一种方法,我们需要提供一张具有特殊布局的纹理,例如类似立方体展开图的交叉布局、全景布局等。然后只需要把该纹理的Texture Type设置为Cubemap即可,unity会为我们做好剩下的事情。在基于物体的渲染中,我们通常会使用一张HDR图像来生成高质量的cubemap。

2.第二种方法是Unity5之前的版本使用的方法。我们首先需要在项目资源中创建一个Cubemap,然后把6张纹理拖拽到它的面板中,在unity5中官方推荐使用第一种方法创建立方体纹理,这是因为第一种方法可以对纹理数据进行压缩,而且可以支持边缘修正、光滑反射(glossy reflection)和HDR等功能

3.前边两种方法都需要提前准备好立方体纹理的图像,它们得到的立方体纹理往往是被场景中的物体所共用的,但在理想情况下,我们希望根据物体在场景中的位置的不同,生成它们各自不同

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值