纹理文件
| 纹理类型 | 用途 | 文件格式 | 必要性 |
|---|---|---|---|
| Diffuse/Albedo Map (漫反射贴图) | 定义物体的基础颜色或纹理。 | PNG、JPEG、TGA、DDS | 必需 |
| Normal Map (法线贴图) | 增加物体表面的细节,模拟细小凹凸效果。 | PNG、TGA、DDS、EXR | 常用 |
| Specular Map (高光贴图) | 控制表面反射光的强度和颜色。 | PNG、TGA、DDS | 常用 |
| Roughness Map (粗糙度贴图) | 控制表面反射光的散射程度,影响表面的光泽感。 | PNG、TGA、DDS | 常用 |
| Metallic Map (金属度贴图) | 控制表面是否为金属,金属的反射效果与非金属不同。 | PNG、TGA、DDS | 常用 |
| Ambient Occlusion Map (环境光遮蔽贴图) | 增强物体细节的阴影效果,模拟现实中的遮蔽现象。 | PNG、TGA、DDS | 常用 |
| Emissive Map (自发光贴图) | 控制物体表面是否发光以及发光的颜色。 | PNG、TGA、DDS | 常用 |
| Displacement Map (位移贴图) | 改变物体表面顶点的位置,实际改变模型几何形状,增加更真实的细节。 | PNG、TGA、DDS | 可选增强 |
| Opacity Map (透明度贴图) | 定义物体的透明度,灰度图中较亮的部分表示不透明,较暗的部分表示透明。 | PNG、TGA、DDS | 可选增强 |
| Bump Map (凹凸贴图) | 通过高度信息模拟表面细节,但不改变几何形状。 | PNG、TGA、DDS | 可选增强 |
| Cube Map (立方体贴图) | 用于环境映射或反射效果,通常由六张贴图组成,表示物体表面反射的环境。 | DDS、HDR、EXR | 可选增强 |
| Light Map (光照贴图) | 存储静态光照数据,用于预计算的烘焙光照,减轻实时光照计算负担。 | PNG、TGA、DDS | 可选增强 |
| Shadow Map (阴影贴图) | 存储光源到场景的深度信息,用于生成阴影。 | PNG、TGA、DDS | 可选增强 |
| Subsurface Scattering (次表面散射) | 模拟光在半透明物体内部的散射,常用于皮肤等材质。 | PNG、TGA、DDS | 可选增强 |
优化和变体:
- Mipmaps - 多级渐远纹理(通常引擎自动生成)
- Compressed Formats - 压缩格式版本(.dds, .ktx 等)
- LOD Variants - 不同细节级别的版本
实际项目中的典型配置:
- 简单材质(如 UI、2D 游戏): 1 个文件:Diffuse Map
- 标准 3D 材质: 3-4 个文件:Diffuse + Normal + Roughness + Metallic
- 高品质材质: 5-6 个文件:以上基础 + AO + Height/Emission
- PBR 标准配置: Albedo, Normal, Metallic, Roughness, AO(5 个文件)
法线贴图
法线贴图(Normal Map)是一种用于模拟表面细节的纹理技术,它通过存储表面法线信息来增强低模物体的视觉细节。
Note
基本原理
法线的概念:
- 法线是垂直于表面的向量
- 决定了光照如何与表面交互
- 影响物体的明暗、反射效果
法线贴图的工作原理:
- 将高精度模型的法线信息 ” 烘焙 ” 到贴图中
- 每个像素存储一个法线向量的 XYZ 分量
- 在渲染时修改表面法线,欺骗光照系统
视觉特征
法线贴图通常呈现蓝紫色调:
- 蓝色为主:Z 轴(垂直向上)分量存储在蓝色通道
- 红绿混合:X、Y 轴分量存储在红绿通道
- 平坦表面显示为蓝色(法线向上)
主要作用
1. 增加表面细节
- 让平面看起来有凹凸感
- 模拟砖块、石头、金属划痕等纹理
- 不增加几何复杂度
2. 优化性能
- 用低模 + 法线贴图替代高模
- 大幅减少顶点数量
- 保持视觉质量
3. 增强光照效果
- 让光照更加真实
- 产生正确的高光和阴影
- 增强材质的立体感
实际应用例子
游戏中的应用:
- 石墙:平面 + 石砖法线贴图 = 立体石墙效果
- 金属板:平面 + 划痕法线贴图 = 有磨损感的金属
- 皮肤:简单模型 + 毛孔法线贴图 = 真实皮肤
制作方法
1. 高模烘焙
高精度模型 → 烘焙工具 → 法线贴图2. 高度图转换
高度图(Height Map)→ 转换工具 → 法线贴图3. 程序生成
- 使用算法生成特定 pattern 的法线
- 如噪声法线、波浪法线等
技术细节
存储格式:
- 每个像素存储 3 个分量(X,Y,Z)
- 范围从 -1 到 1,映射到 0-255
- 通常使用切线空间(Tangent Space)
在 Shader 中使用:
// 采样法线贴图 vec3 normal = texture2D(u_normal_map, uv).rgb; // 转换到[-1,1]范围 normal = normal * 2.0 - 1.0; // 应用到光照计算
什么是纹理打包
纹理通道打包(Texture Channel Packing)是将多种不同的纹理信息(例如法线、粗糙度、金属度、透明度等)打包到一个单一的纹理图像中的技术。这样做可以减少材质的纹理数量,提高渲染效率和性能,尤其在需要多个纹理通道的情况下,常见于 3D 游戏和图形应用的优化中。
https://www.reddit.com/r/vfx/comments/za38av/can_someone_explain_to_me_what_is_channel_packing
你可以把不同的纹理(通常是单通道/灰度)打包到单个纹理的不同 R、G、B,有时是 A 通道中,原因有很多。一个原因是减少纹理文件/纹理调用。另一个原因是,如果你对一个要投影/平铺的纹理这样做,所有数据都会相互对齐(例如,在 R、G、B 中有不同的皮肤细节)。我想说,唯一的真正缺点是确保用于所述通道打包的约定在你的流程中保持一致/做好文档,因为一个在 R、G 和 B 中有不同数据的纹理,其用途就不那么明显了。
假设你有三张贴图:高光粗糙度、凹凸和金属度。与其有三组不同的贴图,你可以把高光粗糙度放在红色通道,凹凸放在绿色通道,金属度放在蓝色通道。你可以这样做,因为它们是灰度数据纹理,实际上不需要 RGB。结果就是你减少了贴图文件,有时可以节省磁盘空间(如果这很重要的话)。你也可以把这个打包的纹理导入到你的 lookdev 包里,从你需要的通道读取到 shader 里,而不是必须导入三个纹理节点。