漫反射贴图表现了什么?如何正确绘制砖缝?

漫反射贴图表现了什么?如何正确绘制砖缝?

漫反射贴图代表游戏中物体表面的反射和表面颜色。 换句话说,它可以显示物体在光照射下的颜色和强度。 我们通过颜色和明暗来绘制漫反射图。 在这张图中,墙砖的裂缝颜色较深,因为它们吸收了更多的光线,而墙砖的表面反射更强,因此吸收的光线较少。 少一点。 在上图中,您可以看到砖块本身是灰色的,砖块之间的裂缝几乎是黑色的。

排除掉复杂的事情之后,我们就来说说显而易见的事情。 漫反射图代表什么? 仅举几例,对象固有的颜色和纹理,以及地图上的光影。 我们可以很容易地理解前面固有的颜色和纹理。 至于后面的光影,我们在绘制漫反射贴图时需要区别对待。 例如,如果我们制作一面墙,每块砖都用模型制作,那么我们就没有必要绘制砖缝,因为这可以通过照明来实现。 但如果我们使用模型只建造一堵墙,并且上面的砖块是用纹理实现的,那么我们就必须绘制砖缝。 从艺术的角度来看,砖缝不仅仅是一条单独的材质条,而且砖缝还负责投影,所以需要在漫反射图上绘制投影,如下图:

没有任何物体能够反射与照射在其上的光相同强度的光。 因此,最好使漫反射贴图变暗。 通常,光滑的表面散射的光较少,因此漫反射贴图可以更亮。

漫反射贴图通过 DiffuseMap 直接应用到材质上。 在重命名约定方面,通常在文件末尾添加“_d”以将其标记为漫反射贴图。

凹凸贴图

凹凸贴图可以为地图添加三维感。 它实际上并不改变模型的形状,而是通过影响模型表面的阴影来达到凸凹的效果。 游戏中有两种不同类型的凹凸贴图,法线贴图和高度贴图。

法线贴图法线贴图

法线贴图定义表面的斜率或法线。 换句话说unity 生成法线贴图,它们改变了我们看到的表面的倾斜度。

法线贴图记录了像素(R,G,B)中的空间坐标(X,Y,Z)的参数。 这就是上面示例图片的含义。

制作法线贴图有两种方法:

1.从三维模型渲染出法线贴图(将高模型和低模型重叠,将高模型上的细节烘焙到低模型的UV中。这里,低模型需要有一个不能有的UV重叠)

2. 将高度图转换为法线贴图。 (NVIDIA的PS插件用于将图片转换为法线贴图)

高度图Heightmaps

什么是高度图? 所谓的高度图,其实就是一个2D数组。 为什么我们需要高度图来创建地形? 你可以这样想,地形其实只是一系列不同高度的网格,这样就可以利用数组中每个元素的索引值来定位不同的网格(x,y),存储的值为网格的高度(z)。

我们这里描述高度图,其实是为了更好的绘制法线图。 很多情况下,我们的法线贴图只能使用现有的漫反射贴图作为材质来绘制,所以需要通过HeightMap Texturing将其转换为法线贴图是一个过程,如果你了解了这个原理,你就能够以更好地控制其影响。

高度图是一个黑白图像,它定义模型表面的高度(以像素为单位)。 越亮的区域,高度越高,图像越白,越高,越暗的区域,越低,灰色在中间,从而表达不同的地形。

当然,UNITY中也出现了HightMap。 例如,在地形菜单中,有导入和导出 HightMap 的命令。

高度图通常是在图形处理软件中绘制的。 他们通常不需要渲染这些,在DOOM3游戏中高度图被转换成法线贴图来使用。 高度图仅用于适应简单的工作流程。 高度图通常通过“Heightmap”功能调用到3D软件中。 我们通常在文件名后添加“_h”来标记。

法线贴图与高度贴图

法线图和高度图

一般来说,法线贴图来自高度贴图。 具体生成方法如下:

将Height Map的每个像素与其上方的像素相减,得到高度差,作为该点法线的x值;

将Height Map的每个像素从其右边的像素减去,得到高度差,作为该点法线的y值;

取1作为该点法线的z值。

推导过程如下:

在x方向上,每个像素与其下方的像素相减,得到一个向量,其中ha为该像素的高度值,hb为下一行的高度值;

在y方向上,每个像素与其左边的像素相减,得到一个向量,其中ha为该像素的高度值,hb为左列的高度值;

交叉两个向量,我们得到

简单来说,就是取两个方向的切向量,对其进行Cross,得到该点的法向量。

还有一种方式是根据每个像素四个边上的点来计算,像素本身不参与计算。

我没有尝试过,所以不知道哪个更好。

而且我认为这种计算只适合单块HeightMap和NormalMap。 例如DOOM3中的NormalMap就无法通过HeightMap来计算。 因此,美工建模时最好同时生成NormalMap和HeightMap,而不是使用HeightMap生成NormalMap。

DOOM3游戏引擎可以将法线贴图和高度贴图组合成凹凸贴图。

绘制具有足够细节的高度图通常比构建具有足够细节的模型然后将其渲染成相应的法线贴图更实用。

可以使用 Addnormals 函数将法线和高度凹凸贴图组合到材质中。

毫无疑问,高度图在大多数游戏引擎中不会出现太多。 它们只是为计算机提供了一种在使用动态光源时计算表面法线的方法。

这说明其实就是将高度图转换为法线图,这样就可以计算出相邻两个不同高度位置之间的斜率。 高度图永远不可能像法线贴图那样拥有那么多细节,这是肯定的。

显然,纯灰度高度图无法捕获应有的细节,因为它是黑白的,因此 RGB 颜色被浪费了,因此您只能使用 256 级强度。

相比之下,法线贴图的每个图像通道都可以使用。 显然游戏动态,法线贴图能够更好地表达凸面和凹面。

高光贴图

什么是高光贴图?

高光贴图用于表达光线照射到模型时的表面属性。 (例如,金属和皮肤、布料和塑料反射不同量的光)以区分不同的材质。

高光贴图表示引擎中物体表面的镜面反射和高光颜色。

材料的反光性越高。 (强度是指如果把这个Specularmap去色,变成黑白图像,图像上的高光越接近RGB0,0,0就会越弱,越接近RGB255高光就会越强, 255,255。)

当我们创建高光贴图时,我们使用实色来表达普通表面的反射,而黑暗的地方会给人一种侵蚀和风化的反射效果。 (对于物体不同材质之间的高光强度,你心里一定有一个非常清晰的关系:哪部分高光最强,哪部分高光最弱,哪部分在中间。一般来说:金属高光>塑料>木材>皮肤>无材质,但这只是一般分类,请勿将其用作突出显示的指导。有时,您处理的物体可能如上图所示,大部分都是由同一类型制成的材质的材质,比如布料,这时候你也要小心区分不同材质之间高光强度的差异,记住,这个阶段一定要保持清醒的头脑,不要急于添加那些细节。大强关系已经决定,光是添加那些细节就会影响你的判断,最终会得到一个层次不清、“花哨”的亮点。很多时候,我们很容易出现这样的问题,那就是去处理物体的亮点太单一。)

上面的地图有问题。 砖的表面会比砖之间的接缝反射更少,但接缝的位置应该几乎不反光。 (确定了整体高光的强度后,开始在高光上叠加细节:比如金属划痕、金属倒角高光、锈迹周围的裸露金属高光、油污、灰尘等。这时候你会发现,如果你在Diffusemap的绘制过程中,保留上面提到的纹理、划痕或细节的图层,只需将Diffusemap中对应的图层拖到Specularmap中,然后根据反映这些细节的程度调整高光强度即可。所以,良好的图层管理习惯是非常有必要的。)

镜面反射贴图中的颜色将用于定义高光的颜色。 组成砖块的材料应该是一些沙子。 它们会反射一些微笑的纹理光,如上例所示。 (为了丰富高光贴图,我们有很多方法:对局部高光进行细微的改变、添加纹理(这个纹理要与材质本身的纹理区分开)、叠加颜色图层(慎用))

高光贴图通过Specularmap函数调用到引擎中。 通常我们在地图后面加一个“_s”来区分。

可以通过镜面映射将凹凸贴图改进为非常漂亮的贴图。 (需要记住的是,单独的高光贴图并不能完全表达材质特性,只有Didffuse、Normal、Specular的组合才能完整表达材质特性。)

在UNITY中,高光贴图通常放置在漫反射贴图的透明通道中。 我们可以利用相关的SHANDER来实现高光效果。

AO 地图

Ambient Occlusiont简称AO图,中文一般称为环境遮挡图。 它是次世代游戏中常用的纹理技术。 很多朋友把它和全局光烘焙纹理混淆了。 事实上,两者本质上是完全不同的。

首先,我们从一个简单的 AO 贴图算法开始:

AO贴图的计算不受任何光线的影响。 它只计算物体之间的距离,并根据距离生成8位通道。 如下图所示,在计算球形物体的AO贴图时,程序使每个像素按照物体的法线发光。 当这个光接触到物体时3D道具,就会产生反馈,比如球右下​​侧的反馈。 一些像素锁发出的光接触到旁边的政治和法律框架,引起反馈并标记附近的物体,这些物体显示为黑色。 ,

球上方像素发出的光没有接触到任何东西,因此它被标记为白色。

简单了解一下算法后,大家就会明白,全局光烘焙模拟的是GI(全局光)呈现的阴影效果,而AO贴图模拟的是模型各个面之间的距离。 两者的性质完全不同。

我举个例子简单对比一下AO贴图和GI阴影贴图的区别。

根据这个低模型,右边计算的AO图的黑白关系是根据物体模型的距离生成的。 不受任何光源效果的影响。 边缘等相对密集的结构正确地产生深色并加强模型结构。 ,在游戏引擎中,与其他通道图混合使用,可以提高游戏的效果。

右边这张是全局光照烘焙贴图的效果,是使用MAX的天光计算结果烘焙出来的。 阴影效果是模拟自然光下模型的光影关系。 在结构紧密的区域(例如裤袋和袖口),由于 GI Tracking 计算会减弱光线以匹配自然光效果,但它不是游戏所需的效果。

在Unity中,我们有两个地方可以调整AO。 一个是在光照图渲染器中,有一个参数是调节AO的。 这实际上渲染了一层AO。 另一种是通过相机特效,有一种屏幕空间环境光遮挡(SSAO)特效。 这两者都可以实现部分AO效果。 有兴趣的朋友可以自己尝试一下。

立方图

归根结底,Cube贴图技术是利用一个虚拟的立方体来包围物体。 从眼睛到物体上某处的向量eyevec被反射(以那里的法线为对称轴),反射向量reflectvec发射到立方体上,在立方体上得到一个纹素(见下图)。 显然,我们需要一个类似天空盒的 6 个纹理来粘贴到这个虚拟立方体上。 按照CUBE MAPPING的本义,它是一张环境贴图,因此将周围的场景渲染成这六种纹理是“正统”的。 也就是说,每次渲染的时候,进行一次离线渲染,在每个矩形的中心放置一个相机来“拍摄”场景,使用FBO渲染到纹理上,然后将这个纹理作为六个纹理之一立方体贴图对象的纹理。 这样,即使是动态物体也可以映射到物体的表面(虽然缺点是无法映射物体本身的任何部分)。

如何制作立方体贴图:

unity3d官网上有一段代码叫做Camera.RenderToCubemap

它讨论了如何将我们的场景烘焙成立方体贴图。 代码附后。 如果有兴趣,可以在 SCRIPT 帮助文件中搜索我上一行提到的关键字。

光照图

什么是烘焙? 简单来说,就是将物体光照的明暗信息保存到纹理中。 它在实时绘制时不再进行光照计算,而是使用预先生成的光照纹理(lightmap)来表示明暗效果。 那么,这有什么作用呢? 什么意思?

益处:

由于省略了光照计算,因此可以提高绘制速度

对于一些过于复杂的光照(如光线追踪、光能传递、AO等算法),实时计算不太现实。 如果预先计算好并保存到纹理中,这无疑会大大提高模型的光影效果。

保存的光照贴图还可以进行二次处理,例如模糊以使阴影边缘更柔和。

当然,也有缺点:

模型多了一层纹理,相当于增加了资源管理成本(异步加载、版本控制、文件大小等)。 当然,你也可以选择将明暗信息写回原始纹理,但这有更多的限制,比如纹理坐标范围、对象实例数量……

模型需要一个可以扩展到纹理平面UV的外层(范围只能是[0,1],不能重叠)。 如果原模型本身就是这样的话,可以省略。 但对于大多数模型来说,可能会使用WRAP/MIRROR寻址,这只能多做一层。 此外,不能强迫每个模型只使用一种纹理,对吗? 所以lightmap的UV还需要一层美术,程序扩展算法这里就不说了。 ...

静态光影效果无法与动态光影效果很好地结合起来。 如果光照方向改变,静态的光影效果就无法变换。 而且,静态阴影不能直接影响动态模型。 对此,反而影响了真实性

肯定不止这几点,但我暂时只想到这几点

那么如何生成光照贴图呢?

最直接的方式:光线追踪……(原理想起来很简单,遵循物体的规律就可以了)

但是光线追踪...我发现即使对于离线生成来说也太慢了 -_-

下面提到的是使用GPU计算的,这和实时光照没有什么区别:

原则:

想想实时渲染的顶点变换过程:pos * WVP之后,顶点坐标变换到屏幕空间[-1, 1]

如果直接将纹理坐标作为VertexShader中的变换结果输出(注意从[0,1]到[-1,1]的变换),那么就相当于直接变换到纹理坐标系。 此时PixelShader中的计算还是和之前一样。 光照,输出结果可以作为光照贴图

静态模型的光照贴图和顶点光照的比较

有一个常见的误解,认为顶点光照是一种廉价的静态模型光照方法,因此应该用作提高地图操作效率和减小文件大小的手段。 这种观点实际上在两个方面都是有问题的。 光照贴图使用一组平坦的 UV,根据正常皮肤贴图的需要。 Lightmap的纹理尺寸可以灵活设置,比如64x64。 该方法提供了Vertex-Lighting用于每个像素的光照数据的数据结构,包括每个顶点接收到的光照的亮度和颜色信息。

该数据结构消耗特定量的内存。 该数量由模型中的顶点数量决定,不能随意更改。 在大多数情况下,静态模型应该设置为使用光照贴图,因为这会产生最佳的视觉效果和最佳的执行效果。 高效,并且比顶点光照消耗更少的内存。 与 Vertex-Lighting 相比,Lightmap 具有以下优点: - Lightmap 可以减少 CPU 和 GPU 的使用 - Lightmap 允许 CPU 计算更少的光照和物体之间的交互 ​​- Lightmap 不需要在 GPU 的多个通道中渲染 - Lightmap pass集成到 Emissive(自发光)通道中,因此可以缩短渲染时间 - Lightmap 可以表示交错覆盖在静态模型三角形表面上的复杂的逐像素光照,但 Vertex -Lighting 只能表示从顶点开始的线性渐变到顶点 - 使用光照贴图的静态模型,您可以通过优化更少的三角形的使用来获得额外的效率改进。

使用顶点光照制作的模型通常需要更高程度的细分以获得更多顶点,以改善顶点之间的光照过渡。 但这种方法的副作用是增加了模型中三角形的数量,影响运行效率。 - 静态模型上的光照贴图可以设置为使用非常小的分辨率,例如 16x16 或 32x32unity 生成法线贴图,以减少内存开销。 这对于远离游戏中心区域的静态模型很有用。 它也适用于接收非常均匀照明的模型。

Vertex-Lighting 不具备这种优化的便利性。 它总是消耗相同数量的内存来存储模型所有顶点的数据结构 - 可以通过调整 UV 的布局来优化光照贴图以提供最佳的光照质量。 例如,如果你有一个球形岩石,你可以将底部三角形的UV尺寸做得很小,这样这部分在整个Lightmap的UV上只占据很小的区域。 这样,对于顶部和侧面,可以获得更大的纹理区域,从而产生更细致的光照效果。 Vertex-Lighting的精度总是对应于顶点数,效果受模型实际尺寸影响(就是模型缩小看起来还可以,放大的话比如一百次,效果会变得粗糙,因为顶点无法改变。次,而Lightmap则没有这个问题,因为它可以灵活设置精度)并且无法优化。 如果静态模型的三角形和顶点数量较少,那么使用Vertex-Lighting可能比使用Lightmap占用更少的内存。 然而,使用光照贴图肯定看起来更好并且更高效。

使用Lightmap可以让LD优化光照质量和内存使用,因此Lightmap显然是比Vertex-Lighting更好的选择。 例如:例如使用游戏UT3的静态模型HU_Deco_Pipes.SM.Mesh.S_HU_Deco_Pipes_SM_Pipe01。 该模型有 2555 个三角形。 和 2393 个顶点。 如果场景中放置该模型的 420 个实例,并且它们都使用顶点光照,则总共消耗 11MB 内存。 如果场景中放置该模型的 420 个实例,并且它们都使用 32x32 光照贴图,则总共消耗 11MB 内存。 850kb内存。 如果场景中放置该模型的 420 个实例,并且全部使用 64x64 Lightmap,那么总共将消耗 3.3MB 内存。 占用的内存量也会反映在地图文件的大小上。 在本示例中的某些实例中,所使用的光照贴图的精度可以设置为 128x128 或更高,以获得最佳光照效果,同时仍然使用比顶点光照更少的内存。 使用 Lightmap 的版本比 Vertex-Lighting 版本的渲染速度快 8-10%。

Mip 贴图和细节贴图

我们先来说说MIPMAP的原理。 它将地图缩小 2 的倍数。直到 1X1。 存储所有缩小的图像。 渲染时,根据像素与眼睛的距离,从适当的层获取纹素颜色并将其分配给像素。 D3D和OGL都有相应的API控制接口。

通过它的工作原理我们可以发现,硬件总是根据眼睛到目标的距离来决定最适合当前屏幕像素分辨率的图层。 假设mipmap纹理为32768x32768,当前屏幕分辨率为1024*1024。 当眼睛距离物体比较近时,mipmap最多只能从1024*1024的Mipmap图层中选择texel。 第三,当使用三线性过滤(trilinear)时,只能访问2048*2048的最大图层选择纹理像素来与1024*1024图层中的像素进行线性插值。

详细地图

顾名思义,这是一张详细的地图。 我这里有一个例子。

使用前:

使用后:

使用的着色器:

原理上不用深究,其实就是层的叠加和混合。 这里有几个关键词,一是Detail的Tiling值,二是导入时需要将Detailmap设置为Mipmap。 你可以尝试调整里面的参数。 至于Mipmap的原理,上面已经介绍过了。

小心收集。

文章来源:https://blog.csdn.net/menuconfig/article/details/8235299