IBL(基于图像的光照技术)

之前说过立方体贴图,它是环境贴图技术的一种实现方式,能够模拟物体周围环境,使用了环境反射的物体可以看起来像表面镀了一层金属一样反射处周围环境。反射探针就是基于立方体贴图实现的一种unity组件。

但是立方体贴图没有什么可调整性,它产生的反射性很强烈,一般只适用于金属、镜子等具有强反射特性的材质,并且开发者并不能灵活控制它。那么有没有一种技术,可以灵活控制立方体贴图技术的反射性,让它是适用于任何材质的物体呢?

这种技术就是基于图像的照明技术(简称IBL)!

IBL的设置

IBL是基于立方体贴图技术改进的一种环境反射技术,它最大的特点是可以灵活控制反射属性,轻松模拟出物体材质光滑、粗糙等特性。这时普通的立方体贴图技术难以做到的。

要使用IBL,只需要将cubeMap的Convolution Type属性 设置为Specular(Glossy Reflection)。

另外,还需要将过贴图的过滤模式filter mode设置为Trilinear(默认为Bilinear),Trilinear能够在不同的mip map层级中进行插值计算,这样保证了每个层级的贴图过渡效果都很顺滑,这是Bilinear无法做到的。

环境反射模拟的是间接光照,将IBL设置为Specular,模拟的是间接光照的镜面反射(高光),如果设置为Diffuse,IBL将模拟间接光照的漫反射效果。

除了直接设置立方体贴图的Convolution Type属性可以用IBL外,还可以通过添加反射探针烘焙贴图的方式动态生成IBL技术的立方体贴图。通过烘焙方式生成的IBL贴图不需要进行任何设置,在烘焙的过程中unity已经帮助我们设置好了

基本原理

IBL并不像cubeMap那样直接存储纹理信息,通过将cubeMap的Convolution Type属性 设置为Specular(Glossy Reflection),unity为帮助我们做了一个IBL最重要的操作:获取到环境贴图后对它进行了一系列离线的光照计算,然后生成了新的光照结果,并把它存储在mip map层级中。

也就是说IBL还有一个重新计算光照的过程,也正是因为如此,我们才能对重新计算的光照进行调整,从而模拟出更多的材质效果。

IBL 光照计算后的cubeMap,会比计算之前更粗糙一些,这些粗糙度信息分布在每个mip map层级中,通过调整层级我们可以看到cubeMap的过渡会比计算之前更流畅。

调整mipMap层级有什么作用呢?

我们知道,区分材质与材质的不同,其中一个非常重要的属性就是粗糙度,通过调整粗糙度,就能模拟出不同的材质效果,而这个mipMap层级的调整,就能达到异曲同工的效果。

手动采样

接下来,我们在shader 中配置一个粗糙度的参数,通过设置粗糙度来采样不同层级的mip map,这里使用texCUBElod()方法,对cubeMap进行采样。

 _Roughness("Roughness",Range(0,1))= 0.5
 
float _Roughness;

float mip_Level = _Roughness * 9.0; // mipmap 9个层级
half4 colorCubeMap = texCUBElod(_CubeMap,float4(reflect_dir,mip_Level));
half3 env_hdr_color = DecodeHDR(env_color,unity_SpecCube0_HDR);

cubeMap通常有9个层级,因此在代码中_Roughness参数 乘以了一个9.0,这样就能灵活切换贴图各个层级的mipMap。

代码中的unity_SpecCube0_HDR,是unity内置的一个专门用于获取cubeMap贴图的变量。

通过设置Roughness参数,就可以调节cubeMap的粗糙度,这样能轻松模拟出金属、非金属的材料质感

这种方式,适用于自定义IBL贴图的场景,如果是由反射探针烘焙生成的IBL贴图,要采用什么方式呢?

自动采样

要对反射探针自动生成的贴图采样,需要使用的unity配置的一个方法UNITY_SAMPLE_TEXCUBE_LOD(),分别传入unity_SpecCube0(内置变量)、反射方向、mipMap层级,这样就能获取到基本的颜色贴图。

之后再对它进行解码操作即可,其他代码和手动采样基本一致。

half4 colorCubeMap = UNITY_SAMPLE_TEXCUBE_LOD(unity_SpecCube0,reflect_dir,mip_Level);
               
half3 env_color = DecodeHDR(colorCubeMap,unity_SpecCube0_HDR);

以上就是IBL技术的最简单展示,我们重点要掌握IBL的基本技术原理,它在Unity中该如何设置,使用shader如何采样IBL贴图。

在实际项目过程中,IBL并不是单独存在的,它通常还会与光照模型、后期处理技术结合一起使用,代码复杂度也会加大。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容