咱们都知道,一个三维场景的画面的好坏,百分之四十取决于模型,百分之六十取决于贴图,可见贴图在画面中所占的重要性。在这里我将列举一些贴图,而且初步阐述其概念,理解原理的基础上制做贴图,也就顺手多了。
我在这里主要列举几种UNITY3D中经常使用的贴图,与你们分享,但愿对你们有帮助。
01
首先不得不说的是漫反射贴图:
漫反射贴图diffuse map
漫反射贴图在游戏中表现出物体表面的反射和表面颜色。换句话说,它能够表现出物体被光照射到而显出的颜色和强度。咱们经过颜色和明暗来绘制一幅漫反射贴图,在这张贴图中,墙的砖缝中由于吸取了比较多的光线,因此比较暗,而墙砖的表面由于反射比较强,因此吸取的光线比较少。上面的这张图能够看出砖块自己是灰色的,而砖块之间的裂缝几乎是黑色的。
刨去那些杂糅的东西,咱们只谈明显的,漫反射贴图表现了什么? 列举一下,物体的固有色以及纹理,贴图上的光影。前面的固有色和纹理咱们很容易理解,至于后面的光影,咱们再绘制漫反射贴图的时候须要区别对待,好比咱们作一堵墙,每一块砖都是用模型作出来的,那么咱们就没有必要绘制砖缝,由于这个能够经过打灯光来实现。但是咱们若是用模型只作了一面墙,上面的砖块是用贴图来实现,那么就得绘制出砖缝了。从美术的角度,砖缝出了事一条单独的材质带外,还有就是砖缝也是承接投影的,因此在漫反射图上,绘制出投影也是颇有必要的,以下图:
没有什么物体可以反射出跟照到它身上相同强度的光。所以,让你的漫反射贴图暗一些是一个不错的想法。一般,光滑的面只有不多的光会散射,因此你的漫反射贴图能够亮一些。
漫反射贴图应用到材质中去是直接经过DiffuseMap的。再命名规范上它一般是再文件的末尾加上“_d”来标记它是漫反射贴图。
凹凸贴图Bump maps
凸凹贴图能够给贴图增长立体感。它其实并不能改变模型的形状,而是经过影响模型表面的影子来达到凸凹效果的。再游戏中有两种不一样类型的凸凹贴图,法线贴图(normalmap)和高度贴图(highmap)。
Normal maps法线贴图
法线贴图定义了一个表面的倾斜度或者法线。换一种说法,他们改变了咱们所看到的表面的倾斜度。
法线贴图把空间坐标的参数(X,Y,Z)记录在像素中(R,G,B),上面的范例图就是这个意思。
有两种制做法线贴图的方法:
1.从三维的模型渲染出一张法线贴图 (用高模跟低模重叠在一块儿,把高模上的细节烘焙到低模的UV上,这里须要低模有一个不能重叠的UV)
2.转换一张高度贴图成为一个法线贴图。(是用NVIDIA的PS插件来转换一张图成为法线贴图)
Height maps高度贴图
什么是HeightMap呢?所谓高度图实际上就是一个2D数组。建立地形为何须要高度图呢?能够这样考虑,地形实际上就是一系列高度不一样的网格而已,这样数组中每一个元素的索引值恰好能够用来定位不一样的网格(x,y),而所储存的值就是网格的高度(z)。
咱们在这里叙述高度图,其实也是为了更好的绘制法线贴图,不少状况下咱们的法线贴图只能在已有的漫反射贴图做为素材进行绘制,这样就是须要由一个HeightMap转换成法线贴图的一个过程,明白了这个原理,作起来也就能够更好的驾驭其效果。
高度贴图是一种黑白的图像,它经过像素来定义模型表面的高度。越亮的地方它的高度就越高,画面越白的地方越高,越黑的地方越低,灰色的在中间,从而表现不一样的地形。
固然在UNITY中也是有HightMap出现的,好比在Terrain菜单中,就有导入和导出HightMap的命令。
高度贴图一般是在图形处理软件中绘制的。他们一般没有必要渲染这些,再DOOM3游戏中高度贴图是被转换成法线贴图来使用的。使用高度贴图仅仅是为了适应简单的工做流程。高度贴图一般经过“ Heightmap ”函数来调用到3D软件中去的,咱们一般再文件名后面加一个"_h"来标示它。
Normal maps vs. height maps
法线贴图和高度贴图通常来讲,Normal Map来自于Height Map。具体生成的方法以下:把Height Map的每一个像素和它上面的一个像素相减,获得一个高度差,做为该点法线的x值;把Height Map的每一个像素和它右边的一个像素相减,获得一个高度差,做为该点法线的y值;取1做为该点法线的z值。推导过程以下:x方向,每一个像素和它下面的一个像素相减,获得向量<1, 0, hb - ha>,其中ha是该像素的高度值,hb是下一行的高度值;y方向,每一个像素和它左边的一个像素相减,获得向量<0, 1, hc - ha>,其中ha是该像素的高度值,hb是左一列的高度值;两个向量Cross,获得简单来讲,就是取两个方向的切线向量,对它们作Cross获得该点的法线向量。
还有另一种作法,是根据每一个象素四边的点计算,而该点象素自己不参与计算。没有试过,不知道哪一种好一些。并且我以为这种计算只适合于单块的HeightMap、NormalMap,像是DOOM3中的NormalMap就没法由HeightMap计算出来了。因此最好仍是在美工建模的时候同时生成NormalMap和HeightMap而不是利用HeightMap生成NormalMap。
DOOM3游戏引擎能够把法线贴图和高度贴图合成在一张凸凹贴图上。
一般咱们绘制一张具备足够细节的高度贴图要比创建一个足够细节的模型而后渲染成相应的法线贴图要实际的多。
法线和高度的凸凹贴图能够经过Addnormals 函数来合并到一种材质中。
毫无疑问,高度贴图大多数游戏引擎中出现的很少。他们只是给电脑一种方法来计算曲面法线当使用动态灯光的时候。
这说明实际上,一张高度贴图被转换成一张法线贴图,以此能够计算出相邻两块不一样高度的位置之间的倾斜面。高度贴图永远不能像法线贴图这样具备足够的细节,这是被确定的。
很明显只有灰度的高度贴图并不能很好的表现应该有的细节,由于它是黑白的,RGB颜色就会遭到浪费,而且所以你只能只用256层级的强度。
相比较来言法线贴图的每个图像通道均可以利用到,显而易见,法线贴图可以更好的来表现凸凹。
Specular maps高光贴图
什么是高光贴图?
高光贴图是用来表现当光线照射到模型表面时,其表面属性的.(如金属和皮肤、布、塑料反射不一样量的光)从而区分不一样材质.
高光贴图再引擎中表现镜面反射和物体表面的高光颜色。
材质的反光程度就越强。(强弱度度是指,若是将这张Specularmap去色成为黑白图,图上越偏向RGB0,0,0,的部分高光越弱,越偏向RGB255,255,255的部分高光越强.)
咱们创建高光贴图的时候,咱们使用solid value来表现普通表面的反射,而暗的地方则会给人一种侵蚀风化的反射效果。(你头脑中要有很清晰的物件不一样材质之间高光强弱的关系:高光最强的是那个部分,最弱的是那个部分,处在中间级别的是哪些部分.通常来讲:金属的高光>塑料>木头>皮肤>不料,可是这个只是一个大体的分类,不要把它做为高光的指导.有时,你处理的物件多是如上图同样,绝大部分都是同一类型材质的,好比布料,这时你也要当心的去分辨不一样材料之间的高光强度的区别.切记,在这个阶段必定要保持清晰的头脑,不要急着去添加那些细节.在大的强弱关系尚未决定以前,就去添加那些细节会影响你的判断,而最后获得一张层次不清晰很“花”的高光.不少时候,咱们容易范这样的毛病,就是将物件的高光处理的太过单一.)
上面的贴图有个问题,砖的表面与砖缝相比将会有比较少的反光,可是砖缝的位置其实应该几乎是没有反光的。(肯定好总体高光的强弱以后,就开始在高光上叠加细节:好比金属划痕,金属倒角高光,锈渍周围的裸金属亮点,油渍,灰尘等.这时,你会发现,若是你在Diffusemap的绘制过程当中,保留了纹理,划痕或以上提到过的细节的图层,你只须要将Diffusemap中的相应图层拖曳到Specularmap中,而后根据这些细节应该反映出来的高光强度调节就能够了.So,良好的图层管理习惯是很是必要的.)
颜色再高光贴图中将会用来定义高光的颜色,组成砖的材料应该是一些沙子,他们将会反射出一些微笑的具备质感的光,这些在上面的例子中已经展现了出来。(为了丰富高光贴图,咱们有不少方法:作局部高光的细微变化,添加纹理(这个纹理要和材质自己的纹理区分开),叠加彩色图层(谨慎用))
高光贴图是经过Specularmap函数调用到引擎中的,一般咱们再贴图的后面加一个"_s"来区别它。
凸凹贴图能够经过高光贴图来改进成至关漂亮的贴图。(要记住的是,单单凭借高光贴图是没法充分的表现材质特性的,只有Didffuse,Normal,和Specular三张配合才能充分的表现材质特性.)
在UNITY中,高光贴图一般放在漫反射贴图的透明通道里,咱们是用相关的SHANDER就能够达到高光的效果。
我在这里主要列举几种UNITY3D中经常使用的贴图,与你们分享,但愿对你们有帮助。
01

首先不得不说的是漫反射贴图:
漫反射贴图diffuse map

漫反射贴图在游戏中表现出物体表面的反射和表面颜色。换句话说,它能够表现出物体被光照射到而显出的颜色和强度。咱们经过颜色和明暗来绘制一幅漫反射贴图,在这张贴图中,墙的砖缝中由于吸取了比较多的光线,因此比较暗,而墙砖的表面由于反射比较强,因此吸取的光线比较少。上面的这张图能够看出砖块自己是灰色的,而砖块之间的裂缝几乎是黑色的。
刨去那些杂糅的东西,咱们只谈明显的,漫反射贴图表现了什么? 列举一下,物体的固有色以及纹理,贴图上的光影。前面的固有色和纹理咱们很容易理解,至于后面的光影,咱们再绘制漫反射贴图的时候须要区别对待,好比咱们作一堵墙,每一块砖都是用模型作出来的,那么咱们就没有必要绘制砖缝,由于这个能够经过打灯光来实现。但是咱们若是用模型只作了一面墙,上面的砖块是用贴图来实现,那么就得绘制出砖缝了。从美术的角度,砖缝出了事一条单独的材质带外,还有就是砖缝也是承接投影的,因此在漫反射图上,绘制出投影也是颇有必要的,以下图:

没有什么物体可以反射出跟照到它身上相同强度的光。所以,让你的漫反射贴图暗一些是一个不错的想法。一般,光滑的面只有不多的光会散射,因此你的漫反射贴图能够亮一些。
漫反射贴图应用到材质中去是直接经过DiffuseMap的。再命名规范上它一般是再文件的末尾加上“_d”来标记它是漫反射贴图。

凹凸贴图Bump maps
凸凹贴图能够给贴图增长立体感。它其实并不能改变模型的形状,而是经过影响模型表面的影子来达到凸凹效果的。再游戏中有两种不一样类型的凸凹贴图,法线贴图(normalmap)和高度贴图(highmap)。
Normal maps法线贴图

法线贴图定义了一个表面的倾斜度或者法线。换一种说法,他们改变了咱们所看到的表面的倾斜度。

法线贴图把空间坐标的参数(X,Y,Z)记录在像素中(R,G,B),上面的范例图就是这个意思。
有两种制做法线贴图的方法:
1.从三维的模型渲染出一张法线贴图 (用高模跟低模重叠在一块儿,把高模上的细节烘焙到低模的UV上,这里须要低模有一个不能重叠的UV)
2.转换一张高度贴图成为一个法线贴图。(是用NVIDIA的PS插件来转换一张图成为法线贴图)
Height maps高度贴图

什么是HeightMap呢?所谓高度图实际上就是一个2D数组。建立地形为何须要高度图呢?能够这样考虑,地形实际上就是一系列高度不一样的网格而已,这样数组中每一个元素的索引值恰好能够用来定位不一样的网格(x,y),而所储存的值就是网格的高度(z)。
咱们在这里叙述高度图,其实也是为了更好的绘制法线贴图,不少状况下咱们的法线贴图只能在已有的漫反射贴图做为素材进行绘制,这样就是须要由一个HeightMap转换成法线贴图的一个过程,明白了这个原理,作起来也就能够更好的驾驭其效果。
高度贴图是一种黑白的图像,它经过像素来定义模型表面的高度。越亮的地方它的高度就越高,画面越白的地方越高,越黑的地方越低,灰色的在中间,从而表现不一样的地形。
固然在UNITY中也是有HightMap出现的,好比在Terrain菜单中,就有导入和导出HightMap的命令。
高度贴图一般是在图形处理软件中绘制的。他们一般没有必要渲染这些,再DOOM3游戏中高度贴图是被转换成法线贴图来使用的。使用高度贴图仅仅是为了适应简单的工做流程。高度贴图一般经过“ Heightmap ”函数来调用到3D软件中去的,咱们一般再文件名后面加一个"_h"来标示它。
Normal maps vs. height maps
法线贴图和高度贴图通常来讲,Normal Map来自于Height Map。具体生成的方法以下:把Height Map的每一个像素和它上面的一个像素相减,获得一个高度差,做为该点法线的x值;把Height Map的每一个像素和它右边的一个像素相减,获得一个高度差,做为该点法线的y值;取1做为该点法线的z值。推导过程以下:x方向,每一个像素和它下面的一个像素相减,获得向量<1, 0, hb - ha>,其中ha是该像素的高度值,hb是下一行的高度值;y方向,每一个像素和它左边的一个像素相减,获得向量<0, 1, hc - ha>,其中ha是该像素的高度值,hb是左一列的高度值;两个向量Cross,获得简单来讲,就是取两个方向的切线向量,对它们作Cross获得该点的法线向量。
还有另一种作法,是根据每一个象素四边的点计算,而该点象素自己不参与计算。没有试过,不知道哪一种好一些。并且我以为这种计算只适合于单块的HeightMap、NormalMap,像是DOOM3中的NormalMap就没法由HeightMap计算出来了。因此最好仍是在美工建模的时候同时生成NormalMap和HeightMap而不是利用HeightMap生成NormalMap。
DOOM3游戏引擎能够把法线贴图和高度贴图合成在一张凸凹贴图上。
一般咱们绘制一张具备足够细节的高度贴图要比创建一个足够细节的模型而后渲染成相应的法线贴图要实际的多。
法线和高度的凸凹贴图能够经过Addnormals 函数来合并到一种材质中。
毫无疑问,高度贴图大多数游戏引擎中出现的很少。他们只是给电脑一种方法来计算曲面法线当使用动态灯光的时候。
这说明实际上,一张高度贴图被转换成一张法线贴图,以此能够计算出相邻两块不一样高度的位置之间的倾斜面。高度贴图永远不能像法线贴图这样具备足够的细节,这是被确定的。
很明显只有灰度的高度贴图并不能很好的表现应该有的细节,由于它是黑白的,RGB颜色就会遭到浪费,而且所以你只能只用256层级的强度。
相比较来言法线贴图的每个图像通道均可以利用到,显而易见,法线贴图可以更好的来表现凸凹。

Specular maps高光贴图

什么是高光贴图?
高光贴图是用来表现当光线照射到模型表面时,其表面属性的.(如金属和皮肤、布、塑料反射不一样量的光)从而区分不一样材质.
高光贴图再引擎中表现镜面反射和物体表面的高光颜色。
材质的反光程度就越强。(强弱度度是指,若是将这张Specularmap去色成为黑白图,图上越偏向RGB0,0,0,的部分高光越弱,越偏向RGB255,255,255的部分高光越强.)
咱们创建高光贴图的时候,咱们使用solid value来表现普通表面的反射,而暗的地方则会给人一种侵蚀风化的反射效果。(你头脑中要有很清晰的物件不一样材质之间高光强弱的关系:高光最强的是那个部分,最弱的是那个部分,处在中间级别的是哪些部分.通常来讲:金属的高光>塑料>木头>皮肤>不料,可是这个只是一个大体的分类,不要把它做为高光的指导.有时,你处理的物件多是如上图同样,绝大部分都是同一类型材质的,好比布料,这时你也要当心的去分辨不一样材料之间的高光强度的区别.切记,在这个阶段必定要保持清晰的头脑,不要急着去添加那些细节.在大的强弱关系尚未决定以前,就去添加那些细节会影响你的判断,而最后获得一张层次不清晰很“花”的高光.不少时候,咱们容易范这样的毛病,就是将物件的高光处理的太过单一.)
上面的贴图有个问题,砖的表面与砖缝相比将会有比较少的反光,可是砖缝的位置其实应该几乎是没有反光的。(肯定好总体高光的强弱以后,就开始在高光上叠加细节:好比金属划痕,金属倒角高光,锈渍周围的裸金属亮点,油渍,灰尘等.这时,你会发现,若是你在Diffusemap的绘制过程当中,保留了纹理,划痕或以上提到过的细节的图层,你只须要将Diffusemap中的相应图层拖曳到Specularmap中,而后根据这些细节应该反映出来的高光强度调节就能够了.So,良好的图层管理习惯是很是必要的.)
颜色再高光贴图中将会用来定义高光的颜色,组成砖的材料应该是一些沙子,他们将会反射出一些微笑的具备质感的光,这些在上面的例子中已经展现了出来。(为了丰富高光贴图,咱们有不少方法:作局部高光的细微变化,添加纹理(这个纹理要和材质自己的纹理区分开),叠加彩色图层(谨慎用))
高光贴图是经过Specularmap函数调用到引擎中的,一般咱们再贴图的后面加一个"_s"来区别它。
凸凹贴图能够经过高光贴图来改进成至关漂亮的贴图。(要记住的是,单单凭借高光贴图是没法充分的表现材质特性的,只有Didffuse,Normal,和Specular三张配合才能充分的表现材质特性.)
在UNITY中,高光贴图一般放在漫反射贴图的透明通道里,咱们是用相关的SHANDER就能够达到高光的效果。
AO贴图
Ambient Occlusiont简称AO贴图,中文通常叫作环境阻塞贴图。是一种目前次时代游戏中经常使用的贴图技术,不少朋友将其与全局光烘焙贴图混淆,其实两者本质是彻底不一样的。
首先,咱们从简单的AO贴图的算法来说:
AO贴图的计算是不受任何光线影响的,仅仅计算物体间的距离,并根据距离产生一个8位的通道。以下图所示,计算球形物体的AO贴图的时候,程序使每一个像素,根据物体的法线,发射出一条光,这个光碰触到物体的时候,就会产生反馈,好比球右下方的一些像素锁发射的光,碰触到了旁边的政法提,产生反馈,标记这里附近有物体,就呈现黑色。、
而球上方的像素所发射的光,没有碰触到任何物体,所以标记为白色。
简单了解算法后,你们就明白,全局光的烘焙师模拟GI(全局光)所呈现的阴影效果,而AO贴图时模拟模型的各个面之间的距离。两者性质是彻底不同的。
我举例简单对比 AO贴图和GI阴影贴图的区别。
根据这个低模,右边计算出的AO贴图的黑白关系,是根据物体模型距离产生的,不存在任何光源效果的影响,边缘部分等比较密集的结构,正确的产生了深色,强化了模型结构,在游戏引擎中,与其余通道贴图混合,能够提高游戏的效果。
右边的是全局光烘焙贴图的效果,是用MAX的天光计算结果进行烘焙,其阴影效果是模拟天然光线下的模型光影关系,在有结构接近的区域(好比裤袋、袖口)因为GI得光线跟踪计算会使其弱化,符合天然界光线效果,可是不是游戏所须要的效果。
在unity中,咱们有两个地方能够调整AO,一个是在光照贴图渲染器中,有一个调整AO的参数,这个是确实渲染了一层AO。还有一个就是经过摄影机特效,有一个屏幕空间环境阻塞的特效screen speace ambient occlusion(SSAO).这两个均可以实现部分的AO效果,有兴趣的朋友能够本身尝试一下。
CUBEMAP
Cube map技术说到底就是用一个虚拟的立方体(cube)包围住物体,眼睛到物体某处的向量eyevec通过反射(以该处的法线为对称轴),反射向量reflectvec射到立方体上,就在该立方体上得到一个纹素了(见下图)。明显,咱们须要一个相似天空盒般的6张纹理贴在这个虚拟的立方体上。按CUBE MAPPING原意,就是一种enviroment map,所以把周围场景渲染到这6张纹理里是“正统”的。也就是每次渲染时,都做一次离线渲染,分别在每一个矩形中心放置相机“拍下”场景,用FBO渲染到纹理,而后把这张纹理做为一个cube map对象的六纹理之一。这样即便是动态之物也能被映射到物体表面了(虽然缺点是不能映射物体自身的任何部分)。
CUBEMAP的制做方法:
http://www.cgtextures.com/content.php?action=tutorial&name=cubemaps
unity3d的官网上有一段代码,叫作 Camera.RenderToCubemap
讲的是怎样把咱们的场景烘焙成cubemap,里面附有代码,有兴趣的能够在SCRIPT帮助文件中搜索我上一行提到的关键词。
Ambient Occlusiont简称AO贴图,中文通常叫作环境阻塞贴图。是一种目前次时代游戏中经常使用的贴图技术,不少朋友将其与全局光烘焙贴图混淆,其实两者本质是彻底不一样的。
首先,咱们从简单的AO贴图的算法来说:
AO贴图的计算是不受任何光线影响的,仅仅计算物体间的距离,并根据距离产生一个8位的通道。以下图所示,计算球形物体的AO贴图的时候,程序使每一个像素,根据物体的法线,发射出一条光,这个光碰触到物体的时候,就会产生反馈,好比球右下方的一些像素锁发射的光,碰触到了旁边的政法提,产生反馈,标记这里附近有物体,就呈现黑色。、
而球上方的像素所发射的光,没有碰触到任何物体,所以标记为白色。

简单了解算法后,你们就明白,全局光的烘焙师模拟GI(全局光)所呈现的阴影效果,而AO贴图时模拟模型的各个面之间的距离。两者性质是彻底不同的。
我举例简单对比 AO贴图和GI阴影贴图的区别。
根据这个低模,右边计算出的AO贴图的黑白关系,是根据物体模型距离产生的,不存在任何光源效果的影响,边缘部分等比较密集的结构,正确的产生了深色,强化了模型结构,在游戏引擎中,与其余通道贴图混合,能够提高游戏的效果。
右边的是全局光烘焙贴图的效果,是用MAX的天光计算结果进行烘焙,其阴影效果是模拟天然光线下的模型光影关系,在有结构接近的区域(好比裤袋、袖口)因为GI得光线跟踪计算会使其弱化,符合天然界光线效果,可是不是游戏所须要的效果。

在unity中,咱们有两个地方能够调整AO,一个是在光照贴图渲染器中,有一个调整AO的参数,这个是确实渲染了一层AO。还有一个就是经过摄影机特效,有一个屏幕空间环境阻塞的特效screen speace ambient occlusion(SSAO).这两个均可以实现部分的AO效果,有兴趣的朋友能够本身尝试一下。
CUBEMAP

Cube map技术说到底就是用一个虚拟的立方体(cube)包围住物体,眼睛到物体某处的向量eyevec通过反射(以该处的法线为对称轴),反射向量reflectvec射到立方体上,就在该立方体上得到一个纹素了(见下图)。明显,咱们须要一个相似天空盒般的6张纹理贴在这个虚拟的立方体上。按CUBE MAPPING原意,就是一种enviroment map,所以把周围场景渲染到这6张纹理里是“正统”的。也就是每次渲染时,都做一次离线渲染,分别在每一个矩形中心放置相机“拍下”场景,用FBO渲染到纹理,而后把这张纹理做为一个cube map对象的六纹理之一。这样即便是动态之物也能被映射到物体表面了(虽然缺点是不能映射物体自身的任何部分)。
CUBEMAP的制做方法:
http://www.cgtextures.com/content.php?action=tutorial&name=cubemaps

unity3d的官网上有一段代码,叫作 Camera.RenderToCubemap
讲的是怎样把咱们的场景烘焙成cubemap,里面附有代码,有兴趣的能够在SCRIPT帮助文件中搜索我上一行提到的关键词。
LIGHTMAP
什么是烘焙? 简单地说, 就是把物体光照的明暗信息保存到纹理上, 实时绘制时再也不进行光照计算, 而是采用预先生成的光照纹理(lightmap)来表示明暗效果. 那么, 这样有什么意义呢?
好处:
因为省去了光照计算, 能够提升绘制速度
对于一些过分复杂的光照(如光线追踪, 辐射度, AO等算法), 实时计算不太现实. 若是预先计算好保存到纹理上, 这样无疑能够大大提升模型的光影效果
保存下来的lightmap还能够进行二次处理, 如作一下模糊, 让阴影边缘更加柔和
固然, 缺点也是有的:
模型额外多了一层纹理, 这样至关于增长了资源的管理成本(异步装载, 版本控制, 文件体积等). 固然, 也能够选择把明暗信息写回原纹理, 但这样限制比较多, 如纹理坐标范围, 物体实例个数...
模型须要隔外一层能够展开到一张纹理平面的UV(范围只能是[0,1], 不能重合). 若是原模型自己就是这样, 能够结省掉. 但对于大多数模型来讲, 可能会采用WRAP/MIRROR寻址, 这只能再作一层, 再说不能强制每一个模型只用一张纹理吧? 因此, lightmap的UV须要美术多作一层, 程序展开算法这里不说起....
静态的光影效果与对动态的光影无法很好的结合. 若是光照方向改变了的话, 静态光影效果是没法进行变换的. 并且对于静态的阴影, 无法直接影响到动态的模型. 这一点, 反而影响了真实度
确定不仅这几点,但我暂时只想到这几点
那么怎么生成lightmap呢?
最直接的办法: 光线追踪....(原理想一想很简单, 按照物体定律来就能够了)
可是光线追踪这东西......就算用来离线生成我都嫌慢-_-
下面说的这个是利用GPU进行计算的, 跟实时光照没什么两样:
原理:
想一想实时渲染的顶点变换流程: pos * WVP以后, 顶点坐标就变换到屏幕空间了[-1, 1]
若是VertexShader里直接把纹理坐标作为变换结果输出(注意从[0,1]变换到[-1,1]), 那么至关于直接变换到了纹理坐标系, 这时在PixelShader里仍是像原来那样计算光照, 输出的结果就能够拿来作lightmap了
静态模型的Lightmap(光照贴图)与Vertex-Lighting(顶点光照)之比较
一般有个误解就是,Vertex-Lighting是一种不费的静态模型打光手段,所以应该被做为提高地图运行效率和减小文件尺寸的手段。这种观点,在这两方面其实都有问题Lightmap使用平展开的一套UV,如同普通皮肤贴图所需的。Lightmap的贴图大小能够灵活设置,好比64x64。这种方式提供了每像素的光照数据Vertex-Lighting使用的数据结构,包含每一个顶点所受光照的亮度和色彩信息。
该数据结构消耗特定量的内存,这个量是由模型的顶点数量决定的,不能随意改变在多数状况下,静态模型应该设成使用Lightmap,由于这能够产生最好的视觉效果,最好的运行效率,并且比Vertex-Lighting消耗更少的内存Lightmap和Vertex-Lighting相比较,具备以下优势:- Lightmap能够减小CPU和GPU的占用- Lightmap让CPU须要计算的光照和物体间的互动更少- Lightmap不须要在GPU的多重pass中被渲染- Lightmap pass被整合进Emissive(自发光)pass中,所以能够缩短渲染时间- Lightmap能够表现交错覆盖于静态模型三角面上的复杂的每像素光照,然而Vertex-Lighting只能表现顶点到顶点之间线形的渐变- 使用Lightmap的静态模型,能够经过优化使用更少的三角形,得到额外的效率提高。
为使用Vertex-Lighting而制做的模型,一般须要较高的细分度,得到更多的顶点来改善顶点之间的光照过渡,然而这种作法的反作用是提高了模型的三角形数量并影响运行效率- 静态模型上的Lightmap能够设置为使用很小的分辨率,好比16x16或32x32,来减小内存开支。这对于远离游戏中心区域的静态模型来讲,很是有用,这一样也适合受光很均匀的模型。
Vertex-Lighting就不具备这种优化的便利,它老是消耗一样数量的内存来存放模型所有顶点的数据结构- Lightmap能够经过调整UV的布局,来进行优化以提供尽量好的光照质量。好比,有一个球形岩石,能够将它的底部的三角形的UV尺寸作得很小,从而让这部分在整个Lightmap的UV上面只占据很小一块,这样,对于顶部和侧面来讲,就得到了更大的贴图面积因而有更精细的光照效果。Vertex-Lighting的精度老是对应于顶点数,而效果又受模型实际大小的影响(就是说缩小了看还能够的模型,放大好比一百倍,因为顶点不能改变,因此效果也变糙一百倍,而Lightmap由于能够灵活设置精度不存在这个问题),而且不能被优化若是静态模型的三角形和顶点数量不多的话,那使用Vertex-Lighting可能会比使用Lightmap占用更少的内存,然而,使用Lightmap绝对是看起来更好的,效率也更高的。
使用Lightmap让LD能够优化光照的质量和内存的占用因此Lightmap显然是比Vertex-Lighting更好的选择举个例子:好比使用UT3这游戏的静态模型HU_Deco_Pipes.SM.Mesh.S_HU_Deco_Pipes_SM_Pipe01该模型有2555个三角形和2393个顶点若是在场景中放置此模型的420个实例,而且都使用Vertex-Lighting,那么总共消耗11MB内存若是在场景中放置此模型的420个实例,而且都使用32x32的Lightmap,那么总共消耗850kb内存若是在场景中放置此模型的420个实例,而且都使用64x64的Lightmap,那么总共消耗3.3MB内存占用内存的量,也会在地图文件的尺寸上有所表现这个例子中的一部分实例,其所用的Lightmap的精度,能够设到128x128或者更高以便得到最佳的光照效果,而仍然使用相比Vertex-Lighting来讲更少的内存。而且使用Lightmap的版本,要比Vertex-Lighting版本在渲染上快8-10个百分点。
什么是烘焙? 简单地说, 就是把物体光照的明暗信息保存到纹理上, 实时绘制时再也不进行光照计算, 而是采用预先生成的光照纹理(lightmap)来表示明暗效果. 那么, 这样有什么意义呢?
好处:
因为省去了光照计算, 能够提升绘制速度
对于一些过分复杂的光照(如光线追踪, 辐射度, AO等算法), 实时计算不太现实. 若是预先计算好保存到纹理上, 这样无疑能够大大提升模型的光影效果
保存下来的lightmap还能够进行二次处理, 如作一下模糊, 让阴影边缘更加柔和
固然, 缺点也是有的:
模型额外多了一层纹理, 这样至关于增长了资源的管理成本(异步装载, 版本控制, 文件体积等). 固然, 也能够选择把明暗信息写回原纹理, 但这样限制比较多, 如纹理坐标范围, 物体实例个数...
模型须要隔外一层能够展开到一张纹理平面的UV(范围只能是[0,1], 不能重合). 若是原模型自己就是这样, 能够结省掉. 但对于大多数模型来讲, 可能会采用WRAP/MIRROR寻址, 这只能再作一层, 再说不能强制每一个模型只用一张纹理吧? 因此, lightmap的UV须要美术多作一层, 程序展开算法这里不说起....
静态的光影效果与对动态的光影无法很好的结合. 若是光照方向改变了的话, 静态光影效果是没法进行变换的. 并且对于静态的阴影, 无法直接影响到动态的模型. 这一点, 反而影响了真实度
确定不仅这几点,但我暂时只想到这几点
那么怎么生成lightmap呢?
最直接的办法: 光线追踪....(原理想一想很简单, 按照物体定律来就能够了)
可是光线追踪这东西......就算用来离线生成我都嫌慢-_-
下面说的这个是利用GPU进行计算的, 跟实时光照没什么两样:
原理:
想一想实时渲染的顶点变换流程: pos * WVP以后, 顶点坐标就变换到屏幕空间了[-1, 1]
若是VertexShader里直接把纹理坐标作为变换结果输出(注意从[0,1]变换到[-1,1]), 那么至关于直接变换到了纹理坐标系, 这时在PixelShader里仍是像原来那样计算光照, 输出的结果就能够拿来作lightmap了
静态模型的Lightmap(光照贴图)与Vertex-Lighting(顶点光照)之比较
一般有个误解就是,Vertex-Lighting是一种不费的静态模型打光手段,所以应该被做为提高地图运行效率和减小文件尺寸的手段。这种观点,在这两方面其实都有问题Lightmap使用平展开的一套UV,如同普通皮肤贴图所需的。Lightmap的贴图大小能够灵活设置,好比64x64。这种方式提供了每像素的光照数据Vertex-Lighting使用的数据结构,包含每一个顶点所受光照的亮度和色彩信息。
该数据结构消耗特定量的内存,这个量是由模型的顶点数量决定的,不能随意改变在多数状况下,静态模型应该设成使用Lightmap,由于这能够产生最好的视觉效果,最好的运行效率,并且比Vertex-Lighting消耗更少的内存Lightmap和Vertex-Lighting相比较,具备以下优势:- Lightmap能够减小CPU和GPU的占用- Lightmap让CPU须要计算的光照和物体间的互动更少- Lightmap不须要在GPU的多重pass中被渲染- Lightmap pass被整合进Emissive(自发光)pass中,所以能够缩短渲染时间- Lightmap能够表现交错覆盖于静态模型三角面上的复杂的每像素光照,然而Vertex-Lighting只能表现顶点到顶点之间线形的渐变- 使用Lightmap的静态模型,能够经过优化使用更少的三角形,得到额外的效率提高。
为使用Vertex-Lighting而制做的模型,一般须要较高的细分度,得到更多的顶点来改善顶点之间的光照过渡,然而这种作法的反作用是提高了模型的三角形数量并影响运行效率- 静态模型上的Lightmap能够设置为使用很小的分辨率,好比16x16或32x32,来减小内存开支。这对于远离游戏中心区域的静态模型来讲,很是有用,这一样也适合受光很均匀的模型。
Vertex-Lighting就不具备这种优化的便利,它老是消耗一样数量的内存来存放模型所有顶点的数据结构- Lightmap能够经过调整UV的布局,来进行优化以提供尽量好的光照质量。好比,有一个球形岩石,能够将它的底部的三角形的UV尺寸作得很小,从而让这部分在整个Lightmap的UV上面只占据很小一块,这样,对于顶部和侧面来讲,就得到了更大的贴图面积因而有更精细的光照效果。Vertex-Lighting的精度老是对应于顶点数,而效果又受模型实际大小的影响(就是说缩小了看还能够的模型,放大好比一百倍,因为顶点不能改变,因此效果也变糙一百倍,而Lightmap由于能够灵活设置精度不存在这个问题),而且不能被优化若是静态模型的三角形和顶点数量不多的话,那使用Vertex-Lighting可能会比使用Lightmap占用更少的内存,然而,使用Lightmap绝对是看起来更好的,效率也更高的。
使用Lightmap让LD能够优化光照的质量和内存的占用因此Lightmap显然是比Vertex-Lighting更好的选择举个例子:好比使用UT3这游戏的静态模型HU_Deco_Pipes.SM.Mesh.S_HU_Deco_Pipes_SM_Pipe01该模型有2555个三角形和2393个顶点若是在场景中放置此模型的420个实例,而且都使用Vertex-Lighting,那么总共消耗11MB内存若是在场景中放置此模型的420个实例,而且都使用32x32的Lightmap,那么总共消耗850kb内存若是在场景中放置此模型的420个实例,而且都使用64x64的Lightmap,那么总共消耗3.3MB内存占用内存的量,也会在地图文件的尺寸上有所表现这个例子中的一部分实例,其所用的Lightmap的精度,能够设到128x128或者更高以便得到最佳的光照效果,而仍然使用相比Vertex-Lighting来讲更少的内存。而且使用Lightmap的版本,要比Vertex-Lighting版本在渲染上快8-10个百分点。
Mipmap和detailmap
首先从MIPMAP的原理提及,它是把一张贴图按照2的倍数进行缩小。直到1X1。把缩小的图都存储起来。在渲染时,根据一个像素离眼睛为之的距离,来判断从一个合适的图层中取出***l颜色赋值给像素。在D3D和OGL都有相对应的API控制接口。
透过它的工做原理咱们能够发现,硬件老是根据眼睛到目标的距离,来玄奇最适合当前屏幕像素分辨率的图层。假设一张32768x32768的mipmap贴图,当前屏幕分辨率为1024*1024。眼睛距离物体比较近时,mipmap最大也只可能从1024*1024的Mipmap图层选取***l。再次,当使用三线性过滤(trilinear)时,最大也只能访问2048*2048的图层选取***l,来和1024*1024图层中的像素进行线性插值。
detailMAP
顾名思义,就是细节的贴图,我这里有一个例子,
使用前:
使用后:
使用的着色器:
原理上不用赘述,其实就是图层的叠加与混合。在这里有几个关键词,一个是Detail的Tiling值,一个是这个Detailmap须要在导入的时候设置为Mipmap,里面的参数你们能够试着调一下,至于Mipmap的原理,已经在上面介绍了。
首先从MIPMAP的原理提及,它是把一张贴图按照2的倍数进行缩小。直到1X1。把缩小的图都存储起来。在渲染时,根据一个像素离眼睛为之的距离,来判断从一个合适的图层中取出***l颜色赋值给像素。在D3D和OGL都有相对应的API控制接口。

透过它的工做原理咱们能够发现,硬件老是根据眼睛到目标的距离,来玄奇最适合当前屏幕像素分辨率的图层。假设一张32768x32768的mipmap贴图,当前屏幕分辨率为1024*1024。眼睛距离物体比较近时,mipmap最大也只可能从1024*1024的Mipmap图层选取***l。再次,当使用三线性过滤(trilinear)时,最大也只能访问2048*2048的图层选取***l,来和1024*1024图层中的像素进行线性插值。

detailMAP
顾名思义,就是细节的贴图,我这里有一个例子,
使用前:

使用后:

使用的着色器:

原理上不用赘述,其实就是图层的叠加与混合。在这里有几个关键词,一个是Detail的Tiling值,一个是这个Detailmap须要在导入的时候设置为Mipmap,里面的参数你们能够试着调一下,至于Mipmap的原理,已经在上面介绍了。
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!但愿你也加入到咱们人工智能的队伍中来!https://blog.csdn.net/jiangjunshowphp