Origin
mp.weixin.qq.com
Tags
简悦
项目
收藏夹
创建时间
收藏类型
Cubox 深度链接
更新时间
原链接
描述
艺视界
在游戏开发中,贴图(Texture)是实现逼真视觉效果的重要元素之一。它们为游戏世界赋予了色彩、纹理和细节,使得玩家沉浸其中。然而,不同类型的贴图在游戏中的使用频率和影响力是不同的。我们将探讨游戏中常用以及不常用的贴图类型,它们是如何制作的、如何应用到游戏中,以及它们如何影响到游戏中的各个方面。游戏贴图作为游戏视觉表现的关键组成部分,在为游戏增添真实感、美感和氛围营造方面发挥着至关重要的作用。通过了解这些贴图类型,我们可以更好地理解游戏制作过程,并为自己的游戏项目选择合适的贴图技术
  • ***#颜色贴图(Color Maps)****
01
Albedo
从下图可以看出来,Albedo 是去掉 Diffuse 的光照和阴影生成的,而在 pbr 工作流下必须要用 Albedo 基本颜色,只是它保存所有的颜色信息和没有照明信息。Unity 的 Shader(着色器)中,把颜色贴图叫做 Albedo
notion image
Specular/Glossiness:使用 Diffuse Map/Albedo Map,使用 Diffsue Map 不同于传统工作流程的 Diffuse Map,它是不带光影信息的(下面有说明)
02
Base Color
Base Color 是把颜色贴图剔除光影变化后,我们看到的最基础的颜色。在 PBR 工作流中颜色贴图叫做 Base Color, 其中包含了电介质的反射颜色和金属的反射率值这两种类型的数据。因为 Base Color Map 中带了金属的反射率值,所以需要配合上 Metallic Map 一起使用的
notion image
Metal/Roughness:使用 Base Color Map,并且纹理中是不带光影信息的
03
Diffuse(Photographic)
光照模型在 Lambertian(兰伯特材质球)着色器中会把颜色贴图叫做 DiffuseMap(也叫颜色贴图),通常在绘制这张 DiffuseMap 的时候会把物体的结构阴影信息也绘制进去。在传统工作流中,Diffuse Map 是带着光影信息的
不同工作流中的 Diffuse
Diffuse Map(漫反射颜色)应该表示物体表面的颜色,在 Unity 中叫做 Albedo。在 Specular/Glossiness 工作流程中,对于金属材质而言它没有漫反射 (或者说比较少),所以使用黑色来填充。而非金属材质反射光少于金属材质,并且它折射的光只有较少的吸收通常重新折射回表面,因此对于非金属材质,使用的是漫反射颜色来填充。需要特别注意的是,漫反射纹理不应该包含任何光照信息,因为将基于(环境)添加光照到物体的纹理上
notion image
图片
颜色贴图主要为 Diffuse、Albedo、Base Color 三种。一般认为这三者是等同的
【理论联系实际,直接上手做东西感受下也会很快掌握】
#透明贴图(Transparency Maps)
04
Alpha
通常透明度存储在 DiffuseMap 的 Alpha 通道中。然而,透明度可以存储在任何位图(红色、绿色、蓝色或 Alpha)的任何通道中,因为每个通道实际上只是一系列灰度。着色器将控制您需要存储透明度贴图的通道
notion image
图片
Alpha 通道通常允许 256 种灰度。一些纹理格式使用较小的范围,如 16、8 或 2(仅包括黑色和白色)。可以在 “Alpha 位深度” 下找到一些视觉示例。灰度越少,文件大小通常越小,这可以节省内存,但这可能会降低透明度的视觉质量。这是一个权衡
notion image
图片
顶点透明度也可用于每个顶点的透明度处理。它通常比纹理映射的透明度更粗糙,因为它依赖于模型的拓扑结构。然而,它不会像位图那样占用大量内存。顶点透明度可以与基于位图的透明度同时使用,从而提供更大的控制。但是,着色器必须专门编写以支持顶点透明度。
notion image
图片
【此熔岩着色器将顶点 alpha 用于透明边。图片由 Eric Chadwick 拍摄。】
04.01-Alpha Blend
Alpha 混合是一种柔和的透明度技术,您可以使用完整的透明度梯度来实现柔和边缘的透明度和部分半透明效果。
通常,您可以获得 256 个灰度等级,白色代表完全不透明,黑色代表完全透明。一些纹理使用较少的灰度来压缩文件大小以节省内存。然而,在渲染时它们通常会被过滤,这可以减轻任何产生的伪影。
Alpha 混合可能会导致填充率损耗。重叠的 Alpha 混合网格,如粒子、树叶或草,会增加填充率,因为同一屏幕像素会被反复绘制。高昂的填充率通常导致较慢的帧速率。
Alpha 混合通常会出现排序问题
notion image
图片
【草使用 alpha 混合,具有 2 遍深度排序】
notion image
图片
【草使用 alpha Test】
04.02-Alpha Test
Alpha Test 是一种完全硬边透明技术,像素要么完全不透明,要么完全透明,没有柔和的边缘。着色器通过设置阈值来测试每个屏幕像素是否开启或关闭。阈值以下的较暗 Alpha 像素将被剔除,较亮的 Alpha 像素将保持不透明。
Alpha Test 没有深度排序问题,但也没有抗锯齿功能,因此在远处可能会出现非常像素化的现象。与 Alpha 混合相比,Alpha 测试在实时渲染中速度快得多。
如果在 Alpha 通道中使用平滑的灰度,可以获得更好的效果。如果只使用黑白而没有灰度,您倾向于在 Alpha 测试时出现大的阶梯现象。DXT1 纹理格式仅具有打开和关闭透明度的功能,它是 DXT5(平滑 Alpha)文件大小的一半,但代价是边缘呈块状
notion image
图片
【使用 8 位 alpha 与 1 位 alpha 进行 Alpha 测试。Alpha 测试模型(左),Alpha 通道(右)】
排序问题
如果您使用 alpha Blend,并且模型具有重叠的透明表面(如头发或草),那么深度排序可能会很糟糕。部分背景将显示出来,而不是其他透明表面。对此有多种解决方案,具体取决于您的游戏渲染器支持的内容。
notion image
图片
【使用 alpha 混合的草,没有排序】
notion image
图片
【使用 alpha 混合的草,并进行 2 遍深度排序】

为什么会发生这种情况?

游戏中的大多数表面都是使用 Z-Buffer 进行排序的,它是场景深度的硬件加速渲染。这允许渲染器通过不渲染被其他像素覆盖的任何像素来以最少的次数绘制每个像素。然而,对于半透明,每个像素都需要绘制多次,并且每次 “绘制” 都必须按正确的顺序排序,否则会出现错误。不幸的是,尽管 Z 缓冲区完全忽略透明度,但它仅使所有多边形完全不透明。这意味着它通常不能用于对透明多边形进行排序
notion image
图片
【Alpha 混合未排序的草和线框】
notion image
图片
【Z 缓冲区忽略 alpha】
要绘制透明表面,渲染器必须弄清楚要在其后面渲染的所有内容,因此它有一个 “后面” 颜色,可以将每个部分透明像素与其混合。渲染器基本上每次混合操作都需要两种颜色,源(表面的像素)和目标(无论后面的是什么)。
为了速度,游戏渲染器通常会尝试以最快的速度找到目标颜色。为了对单独的表面进行排序,渲染器会将一个表面的中心与另一个表面的中心进行比较,以找出前面(源)和后面(目标)的内容。只要两个表面不相交,它们就会以正确的顺序渲染。
大多数问题发生在尝试在同一表面内渲染多个透明三角形时,例如角色头上的头发平面。因为比较所有三角形的中心通常太慢,所以游戏通常只是按照接收三角形的顺序渲染三角形。这通常是艺术家建模的顺序
notion image
图片
【Alpha 混合头发存在排序错误】
Maya 提供了一个叫做 “深度剥离” 的 Viewport 2.0 方法,该方法在大多数情况下都能提高透明度排序。该视口呈现在 2 至 10 次通过(在设置可调) ,这是组合到每个最终的框架,然而在大多数 3D 游戏中使用深度剥离仍然太昂贵
排序修复
由于游戏渲染器通常按照它们创建的顺序渲染三角形,艺术家通常可以通过手动重新排序顶点来修复排序错误
渲染器通常按照它接收到顶点的顺序绘制顶点;这可以被用来帮助它按照所需的顺序绘制 Alpha 混合表面。最靠后的面首先绘制,最靠前的面最后绘制,其余的按顺序绘制在这两者之间。
只需将每个重叠的透明元素分离成单独的对象,然后按照您希望绘制的顺序重新连接它们。只要元素不穿透自身(或其他元素),那么它们应该正确排序。通常不需要对每个三角形进行操作,可以对多个三角形元素(如头发)进行操作。诀窍是找出重叠元素最常见的角度,并朝着那个方向进行操作。
在 Maya 中,Mesh>Combine 会将每个新对象添加到顶点顺序的末尾
在 3ds Max 中,EditablePoly>Attach 也是如此
3ds Max 的视图窗口透明度有三个质量设置:无(适用于 Alpha 混合或关闭)、简单(适用于 Alpha Test)和最佳(适用于 Alpha 混合)。然而,这些设置并不影响 DirectX 着色器材质,它们似乎只影响硬件着色器
透明贴图:
http://wiki.polycount.com/wiki/Transparency_map#Alpha_Blend
#凹凸贴图(Bump Maps)
05
Bump Map
凹凸贴图使用计算机图形技术在 3D 模型表面制造出凹凸不平质感的错觉。通过在对象表面使用灰度图和光影技巧人为地生成这种质感,而非在其表面真实地添加凸起和裂痕。然而,凹凸贴图现已是一种相对过时的技术。
凹凸贴图制造的细节是虚假的,它不会增加模型的分辨率。一般来说,凹凸贴图是 8 位灰度图,拥有 256 种不同的灰度。在凹凸贴图中,灰度值告诉三维软件表面是凹陷还是凸出。当灰度值接近 50% 时,表面几乎没有细节变化;当值变亮时,呈现为凸出;当值变暗时,呈现为凹入。利用凹凸贴图实现皮肤等微小细节非常有效,可以用 Photoshop 等二维软件轻松编辑。
然而,凹凸贴图的问题在于,摄像机角度不合适时,细节容易暴露。因为细节并非真实的几何形状,凹凸贴图无法影响物体的轮廓。
notion image
图片
图源:https://www.cnblogs.com/kekec/p/11828332.html
06
Normal
  • 法线贴图是存储每个像素的方向的图像。这些方向称为法线 (Tangent Space 切线空间)
  • 图像的红、绿、蓝通道用于控制每个像素法线的方向
  • 法线贴图通常用于在低分辨率模型上伪造高分辨率细节。地图的每个像素都存储原始高分辨率网格在该点的表面坡度。这会产生更多表面细节或更好曲率的错觉。然而,模型的轮廓并没有改变
  • 创建法线贴图有两种基本方法:3D 建模和烘焙 / 2D 绘画和转换
notion image
【法线贴图模型、不带贴图的网格和单独的法线贴图】
主要是蓝色。物体可以旋转和变形。适合使网格物体变形,例如角色、动物、旗帜等。
优点:
地图可以轻松重复使用,就像在不同形状的网格上一样。
地图可以轻松平铺和镜像,尽管有些游戏可能不能很好地支持镜像。
更容易覆盖绘制的细节。
更容易使用图像压缩。
缺点:
更难以避免低多边形顶点法线的平滑问题(请参阅平滑组和硬边)
性能比对象空间映射稍慢(但不是很多)
引源:http://wiki.polycount.com/wiki/Normal_map
07
Object space
对象空间法线贴图(也称为模型空间法线贴图)基于整个对象而不是每个面,通常看起来像彩虹般的颜色。与切线空间法线贴图相比,对象空间法线贴图在渲染上较快,更易于创建和编辑。然而,由于它们无法镜像任何 UV,在对称模型上可能会浪费大量纹理空间,且无法进行 UV 动画。因此,在很多情况下,切线空间法线贴图可能更为优越
对象空间法线贴图直接存储了模型空间中的法线方向(通常使用 RGB 颜色通道)。它们在处理形变或蒙皮操作(如动画角色)时可能遇到困难,因为对象空间法线贴图不会自动适应表面变化。对象可以旋转,但通常不应变形,除非着色器已修改以支持变形
总之,对象空间同样被称为局部空间或模型空间,它在一些应用场景下具有优势,但在其他方面可能不如切线空间法线贴图
notion image
优点:
  • 更容易生成高质量的曲率,因为它完全忽略了低多边形顶点法线的粗平滑。
  • 性能比切线空间贴图稍好(但好不了多少)
缺点:
  • 无法轻松重复使用贴图,不同的网格形状需要独特的贴图。
  • 难以正确平铺,并且镜像需要特定着色器支持。
  • 更难覆盖绘制的细节,因为网格表面的基色各不相同。绘制的细节必须转换为对象空间才能与操作系统贴图正确组合
  • 它们的压缩效果不是很好,因为蓝色通道无法像切线空间贴图那样在着色器中重新创建。此外,三个颜色通道包含非常不同的数据,这些数据不能很好地压缩,从而产生许多伪影。使用半分辨率对象空间贴图是一种选择
解释这两种类型的另一种方法是显示空间的方向:
notion image
notion image
引源:
https://help.otoy.com/hc/en-us/articles/4475525848987-Fun-with-Normal-Maps
http://wiki.polycount.com/wiki/Normal_Map_Technical_Details
08
World Space
世界空间法线贴图将具有各种颜色,因为蓝色在世界空间中仅意味着 “向上”。世界空间法线贴图的优点是它不需要额外的每像素变换,因此工作速度更快。缺点是如果您的对象改变形状(角色动画),它就无法正常工作
World Space(世界空间)是基于全局坐标的法线贴图,也是三种法线贴图中最不灵活的一种。这种类型的法线贴图一般仅用于环境这类大型,静态和非对称的物体,或者临时用于诸如 Substance Painter、Substance Designer 之类软件中作为计算特殊效果的一种方法
表示物体的前、后、左、右、上、下方位
notion image
09
Ben Normal map
Bent Normal Map(环境法线贴图)有助于减少照明构建之后发生的漏光现象
环境法线贴图能够和 AO 图结合使用以改善漫反射间接照明,通过将环境发现代替法线用于间接照明来使漫反射间接照明更接近于全局光照
notion image
Bent Normal 常用于离线 AO 渲染中,是对原始法线修改后的向量,考虑周围遮挡情况使其指向光线传入的主方向,如下图 Bend Normal 比原始法线偏右。用于光照计算或者环境光采样用 Bend Normal 在模型边缘处会得到更好的 AO 和光照效果
notion image
10
Displacement
存储高度信息的灰度纹理,投影到高度细分的网格上以创建移位的表面细节。也称为高度图。
类似于凹凸,但在渲染时存储高度信息并修改几何体,同时修改着色和轮廓的外观
notion image
置换贴图通常以浮点文件格式保存,如 16 位或 32 位 TIFF/TGA/EXR,因为标准 8 位灰度图像只有 256 级灰度,这通常会导致高度信息丢失
11
Vector Displacement
Vector Displacement Map(矢量置换贴图)是高度贴图的扩展,与传统 Displacement(置换贴图)不同的是矢量置换贴图记录了模型上各点的高度和方向信息,并储存为 16/32 位浮点颜色信息
notion image
【矢量置换贴图与传统置换贴图】
传统的置换贴图使用的是低模的 UV 坐标,贴图记录了高模和低模之间的差异。而矢量置换贴图在使用类似映射方法的同时,而另一个模型最近的顶点之间的距离,还能在空间中移动顶点。因此也能记录复杂的凹面下(如蘑菇、耳朵等)的顶点信息,将雕刻细节从一个模型转移到另一个模型。
以这个蘑菇为例:传统的置换贴图只能做到改变其高度,但是用矢量置换贴图可以实现更接近原始造型的效果
notion image
图源
https://80.lv/articles/case-study-vector-displacement-mapping-in-real-time/
12
Height map
通常用于使上下移动顶点的地形网格变形
高度图是用作位移图来定义多边形地形的灰度纹理
notion image
通常,较亮的像素会产生较高的高程,较暗的像素会产生较低的高程,而 50% 的灰色像素则不会发生变化。通常,对象纹理的 Alpha 通道用于高度图。景观经常使用高度图
景观也称为地形
地形可以用不同的方法描述
地形覆盖:植被、水、沙漠、干燥、土壤、雪、道路、建筑物
地貌:内生:内力(构造、火山、温泉)| 外源性:冰川形式、海洋形式、喀斯特形式(地貌)
地标:高山、高原、低山、丘陵
并且可以进一步描述为
地形特征:河流、湖泊、海岸线、公路、铁路、聚落
自然资源:土壤、植被、地质、气候
在 CG 中,我们尝试复制现实。为此,我们使用高度图。它以 0-255 的灰度值描述海拔高度
13
Parallax map(视差贴图)
视差贴图是一种实时近似位移贴图的技术,有时称为 “虚拟位移贴图”。每个像素的纹理坐标在渲染时进行调整,以在观看者的眼睛在场景上移动时产生深度错觉。
视差映射的优点是效率。它是位移贴图最便宜的实时技术。缺点是图像质量。视差贴图看起来不像一般来说,视差贴图在墙壁和地板上看起来效果很好。从非倾斜角度观察具有相对较大表面的任何网格都可以是视差映射的合适候选者。视差非常适合平滑的曲线,例如岩石和雕刻。由于扭曲,它不适合陡峭的边缘在高度图中,尽量避免尖锐 / 陡峭的边缘和高的高频细节。这些可能会导致纹理拉伸和渲染伪影
在任何不是相对较大的表面上谨慎使用。在网格边缘可见的地方要特别小心。视差贴图不会超出网格的可见边缘。这看起来很奇怪。您可能希望在可见边缘处使用实际几何图形来增强视差图。(例如,建筑物一角的砖块可能使用实际几何形状,而其他砖块可以通过视差贴图创建。)
notion image
效果视频地址
https://www.bilibili.com/video/BV12i4y1r7Ru?t=2107.6
14
DuDv maps
修改网格的 uv 以每像素为基础变形其他纹理
DuDv 是一种简单的方法,用一种纹理来扭曲另一种纹理的像素。常见的用途包括火焰上方的热浪、水下波纹折射以及厚厚的波纹玻璃扭曲它后面的物体等。
notion image
【DuDv 贴图、将被扭曲的帧缓冲区纹理以及最终场景】
DuDv 贴图原理 DuDv 的工作方式与视差贴图扭曲曲面的方式类似,只是 DuDv 不考虑视角(无视差)。从 DuDv 贴图中获取 Du 和 Dv,对反射贴图中的每个像素,将 Du 添加到反射贴图的 U 纹理坐标,并将 Dv 添加到其 V 坐标。最后偏移反射贴图像素,从而产生失真
notion image
notion image
notion image
DuDv 贴图与法线贴图类似,都是在纹理中存储方向信息,只是主要使用红色和绿色通道,所以位图具有红 / 黄 / 绿的外观。DuDv 贴图实际上是法线贴图的衍生物,可以使用各种工具轻松创建。在转换纹理之前,最好先对其进行模糊处理,以减小扭曲效果的 “锯齿状”。
DuDv 与视差贴图扭曲表面的方式相似,只是 DuDv 没有考虑到视角(无视差),它只是在将反射贴图应用到网格之前移动反射贴图的像素。这个方法的基本原理是从 DuDv 贴图中提取 Du 和 Dv,然后对反射贴图中的每个像素,将 Du 添加到反射贴图的 U 纹理坐标,将 Dv 添加到其 V 坐标,这样就会偏移反射贴图像素,产生扭曲效果。
被 DuDv 贴图扭曲的纹理通常是预先创建的反射贴图(如 Cube Map),或者更好的是实时渲染的其他场景的帧缓冲。要做到后者,每一帧需要为即将反射或折射的内容设置一个特殊的渲染。为节省渲染时间,通常会将场景设置为最低的 LOD 进行这种特殊渲染,并排除非必要的网格。渲染的图像从摄像机的视角投影到表面上,然后使用 DuDv 纹理进行扭曲
制作方式:
DuDv 贴图可以在 Photoshop 或 PaintShop Pro 中手动创建:
从法线贴图开始。
图像 -> 调整 -> 反转 (Photoshop) 或颜色 -> 负片图像 (PaintShop Pro)。
图像 -> 调整 -> 亮度和对比度 (Photoshop) 或颜色 -> 调整 -> 亮度 / 对比度 (PaintShop Pro)。尽可能提高对比度。
15
Flow maps
流向贴图在纹理中存储方向信息,也称为矢量场。这可以用来控制水纹理的 UV 坐标,使纹理绕过岩石流动。它还可以用来控制发型各向异性高光的方向
notion image
制作方式:substance painter;flow mappainter;houdini
# 反射贴图(Specular Maps)
notion image
  • **** 在镜面反射 / 光泽度工作流程工作流中,使用的反射贴图为 Specular 和 Glossiness
notion image
16
Specular Map
  • Specular(高光贴图)表示高光得范围、强度、颜色,在 Specular 工作流中,颜色越亮高光越强,黑色表示没有高光
  • 控制表面反射的程度,可以调节反射的形状。镜面通常只模拟场景中最亮光源的反射。镜面反射贴图也可以用来控制有多少环境地图将出现在一个表面;控制实时灯光的镜面高光的强度 / 颜色的纹理
  • 通常,镜面反射贴图只是在每个像素级别控制高光的亮度。如果着色器支持 RGB,则镜面反射贴图可用于对镜面高光进行着色,这对于具有更复杂反射属性的表面(如金属、甲虫壳等)非常有用有时,着色器还支持对镜面高光的宽度或功率进行逐像素控制,这通常称为镜面光泽贴图
notion image
17
Glossiness
Glossiness(缩写 Gloss,光泽度贴图),定义材质得粗糙度信息,跟 Roughness 相反,0(黑色 - 0 sRGB)表示粗糙,1(白 - 255 sRGB)表示光滑
  • 光泽度无非是指表面反射光线的能力。表面能够反射的光线越多,光泽度越高。表面能够反射的光线越少,光泽度越低。表面反射光线的能力受环境中各种因素的影响,例如落在对象上的那些非常小颗粒的灰尘,以及接触对象时从手上沾染到对象上的油污, 所有这一切都会影响表面反射光线的能力
  • 控制实时灯光的镜面高光的宽度 / 功率的纹理
  • 这通常只需要单色纹理。如果着色器支持 RGB,则光泽贴图可用于控制每种颜色的单独宽度 / 功率,这对于具有更复杂反射属性的表面(如金属、甲虫壳等)很有用
  • 通常,着色器还支持对镜面高光的颜色 / 强度进行逐像素控制
notion image
  • **** 在金属 / 粗糙度工作流中,使用的反射贴图为 Metallic 和 Roughness
notion image
18
Metallic map
Metallic(金属贴图)起到类似于蒙版的作用,区分固有色贴图中的金属和绝缘体数据。在金属性贴图中,0(黑色 - 0 sRGB)表示绝缘体,而 1(白 - 255 sRGB)表示金属
notion image
金属贴图的运行方式类似于掩码的运作方式,因为该贴图向着色器阐释如何分析基础色中的数据。金属感对象的光泽度由粗糙度控制。材质越粗糙,其光泽度就会越低, 而缺少粗糙度将使金属显得非常有光泽
19
Roughness
Roughness(粗糙度贴图)定义材质得粗糙度信息,0(黑色 - 0 sRGB)表示光滑,1(白 - 255 sRGB)表示粗糙。
粗粗糙度是指造成光漫射的表面不规则状况,反射方向根据表面粗糙度自由变化。这改变了光的方向,但是光强度保持恒定不变。表面越粗糙,高光越散越暗。表面越光滑,高光反射集中,尽管反射的光的总量是一点的,表面也会更亮,光会更强
粗糙度贴图采样得来的粗糙度数值会影响一个表面的微平面统计学上的取向度。一个比较粗糙的表面会得到更宽阔更模糊的镜面反射(高光),而一个比较光滑的表面则会得到集中而清晰的镜面反射
notion image
Roughness 粗糙度贴图 与 Glossiness Map 光泽度贴图是相反的。Roughness 反向就变成 Glossiness Map
notion image
BaseColor 贴图包含了来自漫反射贴图的电介质材料值和来自高光贴图的金属材料值。金属贴图用于识别这些区域
Base color:是用于金属度粗糙度工作流中记录颜色信息的材质贴图,只有这一张贴图控制
Diffuse:用于高光反射光泽度工作流,用于记录非金属材质的颜色信息;金属由 specular 控制
但是 Diffuse 和传统工作流中的 Diffuse 贴图是有区别的文章开头有说明。Diffuse 在 Specular/Glossiness 和传统流程的 Diffuse 同名,但贴图属性不同 " 更为重要的一点是 Specular/Glossiness 中 Specular map 不是灰度图,它是 RGB 的贴图,也是可以记录颜色的这很重要
重要详细引用:
https://resources.turbosquid.com/stemcell/materials-texturing-stemcell/stemcell-texturing-guide/
八猴 PBR 官方文档
https://marmoset.co/posts/physically-based-rendering-and-you-can-too/#input
20
Smothness Map (Unity)
平滑度的概念同时适用于镜面反射 (Specular) 工作流程和金属性 (Metallic) 工作流程,并且在两者中的工作方式非常相同。默认情况下,如果未分配 Metallic 或 Specular 纹理映射,则材质的平滑度由滑动条控制。此滑动条可用于控制表面上的 “微表面细节” 或平滑度。
下面同时显示了两种着色器模式,因为如果您选择使用 Metallic 或 Specular 参数的纹理贴图,则会从该贴图中获取平滑度值
notion image
在金属性和镜面反射着色器模式下显示的平滑度参数
notion image
一组从 0 到 1 的平滑度值
在 Unity 中,“微表面细节” 不是直接可见的。它是光照计算中使用的概念。但是,您可以看到这个微表面细节的效果,它表示当光线从对象反弹时散射的光量。在光滑的表面上,所有光线都倾向于以可预测和一致的角度反弹。在极端的情况下,一个完美光滑表面的光反射就像镜子一样。较不光滑的表面会在较宽的角度范围内反光(当光照射到微表面的凸起时),因此反射具有较少的细节并以更倾向于漫射的方式在表面上扩散。
notion image
平滑度值为低、中、高情况下的比较(从左到右),以图表形式显示了材质的理论微表面细节。黄线表示光线到达表面并在不同平滑度下出现的反射角度。
光滑的表面具有非常低的微表面细节,或者根本没有,因此光线以均匀的方式反弹,形成清晰的反射。粗糙的表面在其微表面细节中具有高峰和低谷,因此光线在很宽的角度范围内反弹,平均下来将产生漫射颜色,看不到清晰的反射
notion image
平滑度值为低、中、高情况下的比较(从上到下)在低平滑度级别下,表面上每个点的反射光来自较宽的区域,因为微表面细节凹凸不平并散射光。在高平滑度值下,每个点的光线来自狭窄的聚焦区域,因此能更清晰地反射对象的环境 unity 手册
https://docs.unity3d.com/cn/2021.3/Manual/StandardShaderMaterialParameterSmoothness.html
21
Anisotropic map
各向异性贴图是一种控制实时灯光的镜面高光形状的纹理,通常用于头发着色。各向异性高光的特点是长方向笔触,而不是典型的圆形形状。
纹理通常称为流程图,其概念与法线贴图非常相似,除了不控制表面法线之外,它会扭曲表面特定方向上的镜面高光
notion image
22
BDRF Map
BRDF 代表双向辐射分布函数,是一种描述表面如何反射光的方法。在游戏着色器中,BRDF 通常是更粗略的近似值,经过简化以加快渲染速度。BRDF 贴图是垂直渐变与水平渐变的混合,每个渐变控制表面相对于不同角度反射光线的方式:一个用于相机,另一个用于主光
notion image
这个着色器基于一种纹理查找技术,有些人可能称之为 “伪 BRDF”。这种技术基于常见的斜坡阴影思想,但包括一个视角相关因素。首先,您需要将其中一个查找纹理放在’BRDF 采样器’插槽中。这里是几个不同纹理的例子。它允许您实现各种效果,如漫反射菲涅尔、伪 sss 或卡通阴影。您可以根据这些简单规则在 Photoshop 中轻松创建自己的纹理:朝向光源的像素(这里位于左上角)使用纹理底部(A)进行照明,而朝向相反方向的像素在顶部(B)。朝向摄像机的像素在纹理的右侧(C)进行采样,而 90° 的像素在左侧(D)进行采样
#环境贴图(Environment Maps)
通常用于反射表面,显示模型周围的场景以及反射的内容。这是一种廉价的破解方法,可以避免渲染实际场景的准确视图,而实际场景通常太慢,无法实时渲染。
环境贴图在游戏引擎中用于三个目的:
  1. 反射:模拟闪亮表面的外观,例如铬或水。
  1. 折射:模拟透明表面(如玻璃或水)后面或透过透明表面的视图。
  1. 背景:模拟游戏模型背后的远景。
环境贴图通常被绘制成一个包罗万象的世界
23
Spherical Environment
Spherical Environment Map(球面环境贴图)是最简单的反射映射技术之一。球面环境贴图将环境光存储在球面上,然后用环境光去渲染整个的物体,可以通过鱼眼摄像机获取或者多拍几张照片 360/720 度合成
notion image
球形环境贴图,做到了描述一个球体,由于是通过球体来存储环境信息,这就导致了描述的不是均匀的信息会在靠近球体两极的地方出现扭曲(例如地球南极北极地区实际比在地图上看起来要更大)
notion image
24
Cube maps
立方体贴图是映射到立方体上的六个图像,创建 360° 全景图。图形硬件原生支持立方体贴图,因此它们的转换和渲染速度非常快,因此在游戏中可以使用统一的方法来渲染它们
notion image
立方体通常以当前视点或摄像机为中心。这意味着,当用作背景或天空盒时,它总是显得无限远。如果您在任何使用立方体贴图天空盒的 3d 引擎中打开线框模式,您将看到该框的几何形状。最终它只是一个普通的网格对象
notion image
CubeMap 通常被用来作为具有反射属性物体的反射源
立方体贴图解决了球面环境贴图图像扭曲的问题,但立方体贴图不能模拟多次反射的结果
转换工具
notion image
25
Radiosity Normal Map
Radiosity Normal Map(辐射度法线贴图)是光贴图和法线贴图的特殊混合。可以将照明作为一组三个光照贴图进行烘焙,以存储照明矢量,而不仅仅是亮度 / 颜色。这使表面法线贴图可以接收定向照明,因此,通过烘焙的照明信息可以更准确地照明凹凸
notion image
Valve 在《半条命 2》中广泛使用了这种方法,他们将其称为 “光能传递法线贴图”(Radiosity Normal Mapping)。在他们的 GDC 2004 论文 Half-Life®2 / Valve Source™ 着色
#结构贴图
26
Curvature maps
  • 在生产过程中使用,以灰度级存储凸面 / 凹面
  • 曲率图是存储网格的凸度 / 凹度的纹理。也称为凹度、凸度、凹坑和峰、磨损边缘可用于遮盖表面会出现更多磨损的地方或可能发生次表面散射的地方(凸面),可能积累更多污垢(凹面)的地方以检查表面连续性等
  • 曲率贴图允许提取和存储凹凸信息。黑色的值代表了凹区域,白色的值代表了凸区域,灰色值表示中性 / 平坦区域。通常用于一些特殊效果如磨损等,也是卡通渲染中的常用贴图
notion image
notion image
27
Position 位置贴图
表示的是从下到上的整体渐变梯度关系
notion image
#光照贴图
28
Light map
  • 光照贴图过程将预先计算场景中表面的亮度,并将结果存储在称为 “光照贴图” 的纹理中供以后使用
  • 存储预渲染光照的纹理,因为动态实时光照通常看起来不太好,而且可能会占用性能。
  • 由于光照贴图照明是提前烘焙的,因此美工人员可以使用光能传递等非实时照明技术,这可能需要很多分钟才能渲染。这允许表面接收反射照明、柔和阴影、渗色等,以获得非常逼真的结果
notion image
左:一个简单的光照贴图场景。右:Unity 生成的光照贴图纹理。
传统上,光照贴图存储预烘焙光照的颜色和亮度。 漫反射贴图应用于没有光照的网格(如自发光贴图),然后将光照贴图与其相乘,使光照贴图有阴影的漫反射变暗。
因为光照贴图是乘法的,所以这只能使表面变暗。
然而,可以改为使用过度倍增技术来获得 “过度曝光” 图像。看一下,光照贴图被乘以两次或多次。如果乘以 2 倍,这意味着中灰色将导致漫反射贴图以其常规强度渲染,而较亮的光照贴图值将导致过度亮化,而较暗的值仍会使颜色贴图变暗。如果乘以 4 倍,则 1/4 灰度将成为中间值
notion image
另一种类型的光照贴图称为光能传递法线贴图或定向光照贴图,它将光线存储为方向,以便将其与法线贴图创建高频光照贴图的外观
29
Ambient Occlusion (AO)
环境光遮挡 (AO) 贴图会创建柔和的阴影,就好像模型在没有直接光源的情况下被照亮一样,就像在阴天一样。类似的地图类型:空腔地图、缝隙地图、曲率地图、污垢地图、AO 通常是从几何体烘焙,因为它是使用非实时光线投射照明解决方案创建的。它可以存储在纹理中,也可以存储在模型的顶点颜色中。 屏幕空间环境光遮挡是一种实时 AO 方法,根本不需要烘焙,但它需要更新的显卡,并且存在一些着色错误。
如果 AO 存储为第二个纹理,则可以使用不重叠或镜像的第二组 UV 进行烘焙,有时称为 Atlas 布局。或者,有时 UV 可以按图集布局排列,遮挡可以按原样使用它们,而其他平铺纹理可以使用相同的 UV,但在材质中进行缩放,以便它们重复或平铺;这避免了必须存储两个 UV 集
环境光遮蔽贴图基于物体与其他物体越接近的区域,受到反射光线的照明越弱这一现象来模拟现实照明的一部分效果。该贴图只影响漫反射分配,不影响高光反射分配
notion image
30
Cavity
Cavity 是环境阻塞的狭窄版本,仅将深色阴影留在缝隙和锋利的角落
腔体贴图是存储小规模环境光遮挡的纹理。也称为缝隙图
腔图与曲率图不同,曲率图存储网格的凸度 / 凹度
要烘焙 Curvature 贴图,请使用环境光遮挡并将光线距离设置为较低值
Cavity 贴图使用与环境光遮挡相同的烘焙方法,但它捕获更小的细节
notion image
31
Emissive map
不接受光照的纹理,因此像素以全强度显示。也称为全亮贴图、发光贴图、白炽度贴图或自发光贴图。这用于在黑暗中发光的效果,但不会向相邻表面发光。
自发光材质通常用于那些部分应该从内部照亮的物体上,例如监视器屏幕、高速制动的汽车盘式制动器、控制面板上的发光按钮,或在黑暗中仍然可见的怪物眼睛。简单的自发光材质可以通过颜色和亮度来定义。它可以与漫反射贴图一起使用,以添加发光效果,例如剑上的魔法符文或物体上的加热材料火炬
这个场景看起来非常黑暗。这里的大多数物体都有看起来像小灯的东西。它们具有发射图,但强度值为 0,因此它们不会发光
notion image
让我们在颜色选择器中将强度提高到 3,在这里,几乎所有内容的 HDR 发射颜色强度都提高到 3。吊灯的值稍高一些,为 4。灯的光源非常亮,因此需要更高的发射强度。请注意,仅通过自发光,我们就能够增强该场景中的感知照明。这个角落里没有任何灯光
notion image
现在让我们更进一步,为吊灯添加区域光,以真正将其变成场景中的光源
notion image
引:Unity 中的游戏环境照明艺术
https://cgcookie.com/posts/art-of-lighting-game-environments
32
Thickness 厚度贴图
厚度贴图(Thickness Map)记录了表面厚度信息,测量表面的厚度 / 薄度
通常用于模拟从后面照明时穿过表面的光线,如猫耳朵或拉伸的兽皮。该贴图可用于辅助制作次表面散射(SSS,简称 3S 材质)材质,或直接用于扩散 / 反照率来模拟 SSS 效果
网格的厚度贴图与环境光遮挡烘焙器非常相似,但它将光线从网格的表面投射到内部
纹理属性定义为:
  • 黑色值代表模型的薄部分
  • 白色值代表模型的厚部分
notion image
#其他贴图
33
ID 贴图
用于选择不同的区域,进行分别绘制。相当于 Mask 遮罩
这张贴图主要是为在 PBR 流程中区分不同的材质而生成的,每一种颜色代表一个材质(颜色给到高模上,颜色不要太过相近)
notion image
34
Ramp
Gradient&Ramp Map(渐变图)和 ColorLUT(颜色查找表)也可以认为是颜色贴图的一种,常用于卡通渲染,可以用于手工调节漫反、高光、阴影等 Gradient Map(用于 Color Gradient 颜色分级、颜色校正等)
可以用于优化复杂光照的渲染,比如 lambert blinn-phong 可以把 (NL,NH) 作为 uv 坐标,将光照计算存储在一张贴图中,这样渲染时复杂的计算过程就优化为纹理采样了。另外皮肤、毛发之类复杂计算都可以用此方法优化
我们使用 2D ramp 纹理来实现角色阴影和颜色的细腻变化,以表现出插画风格。纹理的 RGB 通道被用于描述不同阴影层的漫射阴影范围。每个层可以有不同的颜色,使得在明暗变化中可以进行精细的色彩控制
在卡通风格的画面中,如果只有纯粹的明暗变化,阴影部分会显得脏乱且缺乏表现力。通过增加暗部的饱和度和色相变化,整体色彩会更加鲜活。同时,通过调整垂直纹理采样坐标,我们可以实现动态的软硬风格转换。此方法间接地呈现了皮肤次表面散射的效果
notion image
【图源:米哈游技术分享】
通过一层层的上色叠加,皮肤层次细节会变得更加丰富
notion image
ColorLUT 是预先生成的一张结果纹理,可用于优化复杂光照的渲染,如皮肤、毛发等
notion image
35
Lut
使用查找表进行颜色分级
查找表(LUT)可用于使用后处理体积实现颜色校正。不使用三个一维(1D)查找表,而是使用一个三维(3D)查找表。这提供了更复杂的颜色转换,可以用于诸如去饱和度之类的事情。
notion image
虚幻引擎中使用的查找表是一个 16x16x16 颜色的中性 LUT,展开为 256x16 纹理。这些示例显示了中性色和深褐色。如果应用中性 LUT,则不会看到对默认场景的任何更改,但是,如果使用深褐色的场景,则会得到如下结果:
notion image
用作颜色校正查找表的 LUT 纹理
notion image
Substance 3D Painter 允许将颜色配置文件分配到视口 通过加载 LUT 纹理。颜色配置文件可用于校准屏幕的最终颜色以匹配目标,例如特定相机。配置文件通常会通过改变亮度、伽玛、对比度甚至色彩平衡来操纵颜色
notion image
笔记: LUT 代表 “查找表”。这是一种将颜色分级作为后期效果的优化方法。LUT 用于弥补源和结果之间的差异
36
Mask map
mask 就是所谓的遮罩 白就是有,黑就是无,原理是利用的图片灰度信息设置遮罩,显示出我们想要的部分
mask 贴图在图像处理中有多种应用。首先,它可以用作遮罩层,控制其他贴图的可见性。通过使用黑白或灰度值表示不同的透明度,可以创建遮罩效果,例如在游戏中实现战斗伤害效果或添加真实感的血迹或破损效果
其次,mask 贴图用于局部细节的调整。通过选择性地改变或限制贴图的某些区域,可以根据设计需求调整细节。例如,在角色的皮肤贴图中使用 mask 贴图来调整特定部位的颜色,使其更鲜艳或突出
此外,mask 贴图还常用于特效制作。通过定义特定区域的透明度和颜色,可以精确控制特效的位置、形状和强度,如火焰、爆炸或光影效果,使其更加逼真和引人注目
另外,mask 贴图还可用于材质混合和叠加。在游戏引擎中,可以利用 mask 贴图控制不同材质之间的混合效果。例如,地形材质中使用 mask 贴图定义不同区域的属性和纹理,如草地、沙漠和石头。通过调整 mask 贴图的透明度和颜色,实现平滑的材质过渡和自然的视觉效果
notion image
单纯区分不同区域:【R在不同通道上影响的区域】
遮罩贴图包含四个灰度纹理,每个颜色通道中对应一个纹理。HDRP 使用遮罩贴图来存储材质的金属性贴图、遮挡贴图、细节遮罩和平滑度贴图。遮罩贴图将这些纹理存储在以下通道中:
颜色通道
贴图
红色
金属性
绿色
遮挡
蓝色
细节遮罩
Alpha
平滑度
notion image
存放不同纹理
脏迹、污渍、破损、划痕 Mask(可用在 SP 中)
notion image
遮罩图
37
Detail Map
Detail Map (Albedo Emission Specular Normal 等)Detail Map 主要解决相机靠近模型时贴图精度不足的问题,比如地面、皮肤、树木等等靠近看会很模糊,用一张尺度更小的坑坑洼洼的图来增加细节。左上是模糊的地面,右上是细节图,最下面是增加细节后的地面
notion image
用于平铺的局部贴图纹理,以相对较低的成本,内存和性能来增加表面细节(微观和宏观)
38
Noise Map
Noise Map(噪声地图)是一种用于模拟和生成随机、自然、无规律的图案或纹理的技术。它是基于噪声函数计算出的二维或三维图像,其中每个像素或采样点都包含一个对应的数值
噪声函数是一种生成伪随机数的函数,它根据输入的坐标或参数产生输出值。噪声函数通常具有连续性、无规律性和随机性,使得生成的噪声图案看起来自然而不规则
游戏开发中,噪声地图经常用于模拟自然景观、地形、纹理、云层等效果。通过调整噪声函数的参数、频率和振幅,可以控制噪声地图的细节、形态和变化。常用的噪声函数包括 Perlin 噪声、Simplex 噪声和 Worley 噪声等
notion image
39
Depth Map
相机深度图可以用于渲染水、雾、扫描、半透物体等
Depth Map(深度图)是一种图像或数据结构,用于记录场景中每个像素的深度信息。它表示了从摄像机或观察者视角到场景中不同物体的距离或深度值
(解释一:Depth Map 通常是以灰度图像的形式表示,其中较暗的像素表示较远的物体,而较亮的像素表示较近的物体。深度值可以通过多种方式获得,如使用深度传感器、渲染引擎的深度渲染等)
notion image
(解释二:深度贴图是一种灰度图像,用于表示场景中每个像素在 3D 空间中距离摄像机的深度。像素值越亮,表示离摄像机越远;像素值越暗,表示离摄像机越近。深度贴图在许多计算机图形应用中有广泛应用,如景深模拟、遮挡剔除、阴影生成等)UE5 中
notion image
40
Camera Depth
Camera Depth Map(相机深度图)是指从摄像机视角生成的深度图。它记录了从摄像机到场景中各个物体的距离。相机深度图可以用于进行景深效果的后期处理,例如在后期合成中模拟景深,使得物体根据其深度值以不同的方式进行模糊或聚焦
41
Camera Depth Normal
Camera Depth Normal Map(相机深度法线图)是一种基于相机深度图生成的法线贴图。它使用相机深度图的深度值计算出每个像素的法线方向。法线方向表示了物体表面在空间中的朝向。相机深度法线图可用于实现光照效果、阴影计算和物体表面反射等
深度图延伸阅读:
https://lookingglassfactory.com/blog/depth-map
42
Caustics(焦散)
根据高度图和光线方向生成投影焦散。有灰度和彩色版本,差异很细微,但彩色版本增加了颜色分散效果。光线从单个点投射,不使用环境贴图
焦散现象是指在游泳池、河流、湖泊和海洋中常见的不断变化的光线图案。当阳光照射到水面时,会沿着不同的方向产生反射和折射。水面充当了扭曲的透镜,在附近物体上聚焦和散焦阳光。要在计算机图形学中正确模拟这种现象相当耗费资源,可以使用双向路径追踪或光子映射等技术来实现
notion image
文件地址:
https://www.dgp.toronto.edu/~stam/reality/Research/PeriodicCaustics/index.html
https://www.dualheights.se/caustics/
43
Foam Map
泡沫贴图、浪花贴图用于水面超过一定值时泡沫会和水面颜色混合,水面顶点越高泡沫透明度越大
notion image
44
Ripple Map
常用于雨滴水纹、物体落入水中的水纹等,可以算是 flowmap 的一种
notion image
45
Matcap
MatCap 是将渲染好的结果通过材质保存,然后用 View 空间法线朝向,直接映射到模型上。Zbrush 的默认材质就是 MatCap
MatCap 在静止的效果还可以,但是动起来就穿帮,因为它毕竟不是计算得到的
MatCap 因为动起来很假,所以一般不用它做完整的光照模型,光照模型还是会用 BRDF 来算
MatCap 的用途:
MatCap 可以用来模拟环境镜面反射,一般在展示界面、商城等需要很精细的展示情况下才加环境镜面反射。因为这些情况镜头不动,只是模型动,对于 MatCap 来讲穿帮的问题会小一点,而且性能比后面讲的 CubeMap 省
notion image
【图:庄懂的技术美术入门课 (美术向)B 站搜】
一种无视 BRDF,将 BRDF 染结果,用 VieW 空间法线朝向,直接映射到模型表面的算法;
常用来模拟环境反射;
46
3D Texture
3d 纹理最常用于体渲染,比如云、高度雾等。Unity 不支持 3d 纹理的文件格式,但是支持动态创建 Texture3D,这样可以自己保存为 asset 格式或者自定义格式,在运行时转换为 Texture3D。因为体渲染比较常用的方式是 raymatching,步进次数少效果很难表现出来,在移动端效率比较低。图来 HorizonZeroDawn
notion image
47
Grab Pass
Grab Pass 技术,就是编写 Shader 当中,将屏幕帧缓存抓出来一张贴图,并在当前物体或者后续渲染当中,复用这张帖图的技术。这个技术比较常用在需要修改或者移动像素位置的场景,例如,做扭曲效果,水面折射效果等
GrabPass 可以用于热浪扭曲、半透冰块、冲击波等需要背景用于渲染的情况,在移动端效率不高,不要求动态背景时可以用 Cubemap 来代替
notion image
引源:https://zhuanlan.zhihu.com/p/75813429
48
Derivative Map
这是由顽皮狗 -Morten Mikkelsen 首先提出法线图的衍生方式
(Bump Mapping Unparametrized Surfaces on the GPU),因为用法线图一般在切线空间用于光照计算,而这种方法则不需要切线空间的参与,效率和效果都会更好,不用法线图,而是表面梯度图,和高度梯度图是不同的
notion image
49
Vertex Texture fetch

在 Vertex Shader 中读取上一帧水面高度纹理,在当前帧继续波动,这可以用于交互式水渲染,不过顶点纹理拾取是比较耗费资源的操作,不需要交互的水面是用不到的,对于海战类型的游戏会比较有用

notion image
这里本来只有一个平整的网格,和一张类似高度图的纹理。运用 VTF 把顶点对应的纹理坐标的像素值拉出来转化为灰度(转化法同见 [基于亮度的图像二值化处理] ),并转化为该网格顶点的 “高度”。最后的纹理只是平铺上去(那不是阴影哦)。灰度高的地方对应的高度高,灰度低的地方对应的高度低。这就是高度场啊,这就是 VTF 最典型的应用
notion image
引源:
https://zhuanlan.zhihu.com/p/158629775
50
Distor map
扭曲图比较常用于半透物体,用于扭曲背景。比如下图冰块
notion image
51
Lens map
(Rain/Snow/Freeze/Glare/Flare/Flash/Gleam/starburst)
做镜头效果会需要很多类似雨滴、雪花、脏迹、冰冻、炫光、星星等贴图。比如下面镜头雨滴
notion image
notion image
52
Jitter/Sparke/Glitter
这种闪烁的噪点主要用于沙子、雪等渲染,主要用于表现颗粒感。这可以用噪声图来用于渲染,也可以用函数生成,一般类似 frac(a*sin+b) 这样形式,可以搭配 WorldPos、ViewPos、Time 来组合成函数
notion image
53
SBSAR
SBSAR 格式是 Substance Designer 软件中使用的一种纹理材质文件格式
SBSAR 文件的主要优势在于它们的非常高的自定义程度和较小的文件大小。参数化材质使得艺术家和游戏开发者可以在不改变整个纹理的基础上,轻松调整材质的各种属性,如颜色、纹理尺寸、细节等。这大大提高了工作流程的灵活性和效率
此外,SBSAR 文件通常比传统的位图纹理文件更小,有助于降低游戏内存占用为了在游戏引擎(如 Unity 或 Unreal Engine)中使用 SBSAR 格式的材质,需要安装相应的 Substance 插件。安装插件后,可以直接将 SBSAR 文件导入到游戏引擎中,并在引擎内调整材质参数,实现所需的视觉效果
安装并开启插件
notion image
导入 ue5 选择要使用的模板也可以使用自己模板
notion image
双击打开就可以调整我们暴露的参数
notion image
整理分类目录参考:
http://wiki.polycount.com/wiki/Texture_types#Specular_Maps
notion image
图片
notion image
图片
坚持与您 “分享” 最有价值 “干货” 内容
本期分享就到这里,我们下期见!
#更多详细文章分类
知乎专栏 | 左侧文章目录便于查找 https://zhuanlan.zhihu.com/p/659080390
notion image
关注我们
学习不止、不止学习
notion image
notion image
公众号小编
notion image
公众号
notion image
哔哩哔哩 > 本文由简悦 SimpRead 转码