Graphics: Texture

Graphics: Texture

有几种贴图?

在图形学中,贴图(Texture)是增强3D模型真实感和细节的核心技术。以下是12种常见贴图类型的分类详解,涵盖它们的作用、原理、应用场景及使用方法,结合代码和案例说明:


📌 1. 基础颜色贴图(Albedo/Diffuse Map)

• 作用:定义材质的基础颜色(无光照信息)。

• 为什么需要:分离颜色与光照计算,避免重复烘焙阴影。

• 格式:sRGB色彩空间(通常为PNG/JPG)。

• 用法示例(GLSL):

vec3 albedo = texture(albedoMap, uv).rgb;

📌 2. 法线贴图(Normal Map)

• 作用:模拟表面凹凸细节(不改变几何体)。

• 为什么需要:低多边形模型表现高模细节。

• 原理:RGB通道存储切线空间法线向量(范围[-1,1]映射到[0,1])。

• 用法:

vec3 normal = texture(normalMap, uv).rgb * 2.0 - 1.0; // 转换到切线空间
normal = normalize(TBN * normal); // TBN为切线空间矩阵

📌 3. 粗糙度贴图(Roughness Map)

• 作用:控制表面微观粗糙度(0=镜面,1=完全漫反射)。

• PBR核心:决定高光反射的锐利程度。

• 用法:

float roughness = texture(roughnessMap, uv).r;

📌 4. 金属度贴图(Metallic Map)

• 作用:标记金属(1)与非金属(0)区域。

• PBR规则:金属区域Albedo直接作为反射颜色。

• 示例:

float metallic = texture(metallicMap, uv).r;
vec3 F0 = mix(vec3(0.04), albedo, metallic); // 基础反射率

📌 5. 环境光遮蔽贴图(AO Map)

• 作用:预计算环境光遮蔽阴影(缝隙/凹陷处更暗)。

• 优化手段:替代实时全局光照计算。

• 用法:

float ao = texture(aoMap, uv).r;
vec3 color = (diffuse + specular) * ao;

📌 6. 高度贴图(Height/Displacement Map)

• 作用:通过顶点位移实现真实几何凹凸(不同于法线贴图的视觉欺骗)。

• 格式:灰度图(白色=凸起,黑色=凹陷)。

• 细分曲面:需配合Tessellation使用(DirectX/OpenGL)。

// HLSL示例(曲面细分阶段)
float height = texture(heightMap, uv).r;
vertex.y += height * displacementScale;

📌 7. 自发光贴图(Emissive Map)

• 作用:使部分表面发光(如霓虹灯、屏幕)。

• HDR支持:通常使用EXR格式存储高亮度值。

• 代码:

vec3 emission = texture(emissiveMap, uv).rgb * intensity;
fragColor.rgb += emission; // 直接叠加到最终输出

📌 8. 透明度贴图(Alpha Map)

• 作用:控制像素级透明度(如树叶、栅栏)。

• 通道:通常存储在Albedo贴图的Alpha通道。

float alpha = texture(albedoMap, uv).a;
if (alpha < 0.5) discard; // Alpha Test

📌 9. 次表面散射贴图(Subsurface Scattering Map)

• 作用:模拟光线在半透明材质内的散射(皮肤、玉石)。

• 技术:需配合次表面散射算法(如Diffusion Profile)。

float sss = texture(sssMap, uv).r;
vec3 scattering = calculateSSS(sss, thickness);

📌 10. 曲率贴图(Curvature Map)

• 作用:标记表面曲率(凸起/凹陷边缘),用于边缘磨损特效。
• 生成方式:通过ZBrush/Mari等工具烘焙。

📌 11. 各向异性贴图(Anisotropy Map)

• 作用:控制各向异性高光(如拉丝金属、头发)。
• 原理:修改高光形状(非圆形)。

vec2 anisotropy = texture(anisotropyMap, uv).rg;
vec3 specular = calculateAnisotropicSpecular(anisotropy);

📌 12. 遮罩贴图(Mask Map)

• 作用:混合多种材质(如泥土+石块)。
• 引擎应用:UE5的Virtual Texture系统。

float mask = texture(maskMap, uv).r;
vec3 materialA = texture(materialAMap, uv).rgb;
vec3 materialB = texture(materialBMap, uv).rgb;
vec3 final = mix(materialA, materialB, mask);

📌 贴图使用流程(以Blender为例)

  1. 导入贴图:
    # Blender Python API
    import bpy
    texture = bpy.data.images.load("path/to/albedo.png")
  2. 连接节点:
    bsdf = mat.node_tree.nodes["Principled BSDF"]
    tex_node = mat.node_tree.nodes.new("ShaderNodeTexImage")
    tex_node.image = texture
    mat.node_tree.links.new(tex_node.outputs[0], bsdf.inputs["Base Color"])

📌 为什么需要这么多贴图?

  1. 物理准确性:PBR要求多参数精确控制(如金属度/粗糙度分离)。
  2. 性能优化:预计算(如AO)替代实时计算。
  3. 艺术控制:允许美术师精细调整每个材质属性。

📌 学习资源

• 工具:Substance Painter(贴图制作)、RenderDoc(调试)。
• 书籍:《Real-Time Rendering》第4章。
• 教程:LearnOpenGL Textures

掌握这些贴图,你就能驾驭从风格化卡通到影视级渲染的所有需求! 🎨

什么是PBR贴图?

您的问题非常关键!PBR贴图(Physically Based Rendering Textures) 实际上是上述多种贴图的组合使用规范,而非单一贴图类型。以下是针对PBR贴图的完整解析,补充说明其核心要点和实际应用:


📌 什么是PBR贴图?

PBR贴图是一组基于物理渲染规则的纹理组合,用于精确模拟真实世界材质的光学行为。它通过多张贴图协同工作,确保材质在不同光照环境下保持物理正确性(如能量守恒、微表面理论)。


📌 PBR贴图的核心成员

以下是PBR工作流中必须或常用的贴图类型及其作用:

贴图类型 PBR中的作用 非PBR对比
Albedo Map 纯颜色信息(无光照阴影) Diffuse Map可能包含烘焙光照
Normal Map 表面微观几何细节(切线空间法线) 同非PBR,但精度要求更高
Roughness Map 控制微表面粗糙度(0=光滑,1=粗糙) Gloss Map(1-粗糙度,易混淆)
Metallic Map 标记金属(1)与非金属(0)区域 旧流程用Specular Map模拟金属
AO Map 环境光遮蔽阴影(增强缝隙暗部) 非PBR中可能被Diffuse贴图合并

📌 为什么PBR需要特殊贴图?

  1. 物理一致性
    • 金属度贴图:金属的反射颜色由Albedo直接定义(非金属反射为灰色)。
    • 粗糙度贴图:统一控制高光散射范围,避免非PBR中“高光强度”和“模糊度”参数冲突。
  2. 动态光照适应性
    PBR材质在任意HDR环境光下都能表现正确(传统材质需针对特定光照烘焙)。
  3. 标准化工作流
    行业标准工具(Substance Painter、Quixel)默认输出PBR贴图集。

📌 PBR贴图使用示例(Unreal Engine)

// UE5材质节点示例
void Main(
Texture2D AlbedoTex,
Texture2D NormalTex,
Texture2D RoughnessTex,
Texture2D MetallicTex,
out float3 BaseColor,
out float3 Normal,
out float Roughness,
out float Metallic
) {
BaseColor = AlbedoTex.Sample(uv).rgb;
Normal = UnpackNormal(NormalTex.Sample(uv).rgb);
Roughness = RoughnessTex.Sample(uv).r;
Metallic = MetallicTex.Sample(uv).r;
}

📌 常见PBR贴图组合

① 基础PBR套装(必备)

T_Albedo.png

T_Normal.png

T_Roughness.png

T_Metallic.png

T_AO.png(可选但推荐)

② 扩展PBR贴图(高级效果)

T_Height.png(视差遮挡)
T_Subsurface.png(皮肤/蜡质材质)
T_Anisotropy.png(拉丝金属)


📌 PBR贴图生成工具

  1. 手动制作
    • Substance Painter:手绘/智能材质生成PBR贴图集。

    • Photoshop + NVIDIA Texture Tools:转换普通贴图为PBR格式。

  2. AI生成
    • Stable Diffusion + ControlNet:输入文本生成PBR贴图(需后处理)。

    • Materialize(免费工具):从单张照片生成PBR贴图。


📌 常见误区解答

❌ 误区1:PBR贴图是某种特殊文件格式。
✅ 事实:PBR是贴图的使用规范,格式仍为PNG/EXR等。

❌ 误区2:PBR必须配合光线追踪使用。
✅ 事实:PBR在光栅化(如UE4 Mobile)和光线追踪(如UE5 Lumen)中均可使用。

❌ 误区3:Roughness和Glossiness贴图可互换。
✅ 事实:Roughness = 1 - Glossiness,需注意引擎约定(如Unity用Smoothness)。


📌 学习资源推荐

• 视频教程:
Substance Painter PBR全流程
• 论文:
《Physically Based Shading at Disney》
• 实践工具:
Marmoset Toolbag(实时PBR材质预览)

掌握PBR贴图,你就能产出符合3A游戏标准的材质! 🎮