【Unity Shader】(八) ------ 高级纹理之立方体纹理及光线反射、折射的实现

笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题。

【Unity Shader】(三) ------ 漫反射和高光反射的实现
【Unity Shader】(四) ------ 纹理之法线纹理、单张纹理及遮罩纹理的实现
【Unity Shader】(五) ------ 透明效果之半透明效果的实现及原理
【Unity Shader】(六) ------ 复杂的光照(上)
【Unity Shader】(七) ------ 复杂的光照(下)

目录

前言

一. CubeMap

1.1 立方体纹理

1.2 对立方体纹理的采样

1.3 使用立方体纹理的优劣

1.4 立方体纹理的布局

1.5 如何制作立方体纹理

1.5.1 CubeMap 特殊布局纹理制作

1.5.2 使用 6 张纹理制作

1.5.3 脚本生成纹理

二. 光线反射

2.1 何为光线反射

2.2 反射的实现

三. 光线折射

3.1 何为光线折射

3.2 实践

四. 菲涅耳反射

4.1 什么是菲涅耳反射

4.2 简单菲涅耳反射的实现

五. 总结

 

前言

关于纹理,之前在【Unity Shader】(四) ------ 纹理之法线纹理、单张纹理及遮罩纹理的实现 已经解释过相关原理,不过那些是属于低维纹理,在高级纹理中,也有许多纹理是我们常见到的或常用的,同时它们能够实现十分精美的效果。受限于篇幅,本文主要介绍立方体纹理及其相关应用,下一篇中将继续介绍其它高级纹理。

一. CubeMap

 

1.1 立方体纹理

单单看标题,读者可能会不太明白我要说什么,不过说到天空盒,读者应该就懂了。我们来看一下官方对 CubeMap 的定义:

可以简单理解为:CubeMap 是六个假想面的集合,这六个面对应着一个正方体的 6 个面,每个面表示沿着世界空间下的轴向观察所得的图像。整体代表着环境的反射。 CubeMap 正常用于捕捉环境反射,而读者熟悉的天空盒子和环境映射也是常常使用这种纹理

 

1.2 对立方体纹理的采样

我们先说如何采样,在详细说如何制作 CubeMap ,对立方体纹理采样需要提供一个三维的纹理坐标。这个坐标会表示一个方向(世界空间下),这个方向矢量从中心出发,向外延伸,然后和 6 个面相交,然后就可以通过交点来采样得到结果

 

1.3 使用立方体纹理的优劣

纹理不止一种,立方体纹理常用也是有其理由的,我们可以看到其优劣

  • 实现起来简单快速(稍后会解释),效果好
  • 不实时,加入新光源或物体时需重新生成
  • 不能模拟多次反射

当然,在现实中,我们在项目中使用普通的立方体纹理作为天空盒子等操作效果已经足够好了。

 

1.4 立方体纹理的布局

虽然名字中带有立方体,但纹理布局并不全然是一个立方体的展开。事实上,Unity 支持着数种布局的立方体纹理,而且大多数情况下,Unity 会自动检测它们。下面列举几种常见的布局

 

常见的:

 

 

圆柱形布局(全景图常用)

 

球形布局

 

默认情况下,Unity 会查看纹理的宽高比以确定最合适的布局

 

1.5 如何制作立方体纹理

制作立方体纹理有三种方法,下面我们逐一介绍

 

1.5.1 CubeMap 特殊布局纹理制作

制作立方体纹理,最简单的方法就是在特殊布局的纹理的 Inspector 面板中设置为 Cube,如图

这张纹理就变成了立方体纹理了,然后把这张纹理赋给一个材质便可,此时该材质会自动使用 Skybox / CubeMap 的 shader 。当然,要谨记的是这适用于特殊布局的纹理,常用此方法使用HDR贴图制作天空盒子,效果十分好。

 

 

 官方也是推荐使用这种方法,因为这种方法可以

  • 压缩纹理数据
  • 修正边缘,光泽反射卷积(光滑反射)
  • 支持HDR

 

我们来欣赏一下HDR制作的天空盒子

 

1.5.2 使用 6 张纹理制作

使用 6 张独立不同的纹理手动创建立方体纹理也是常见的一种方法。创建一个材质,shader 设置为 Skybox / 6 Sided 。

要注意的是:

  • 每张纹理都是独立的,且要注意其对应的位置
  • Wrap Mode 设置为 Clamp ,防止在边界处出现不匹配的现象
  • Exposure 代表天空盒子的亮度

就可以实现以下的效果:

谨记:每张纹理都必须正确对应其对应的位置

 

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值