ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

AI生成法线贴图全流程:从原理到渲染接入

AI生成法线贴图全流程:从原理到渲染接入 在 3D 渲染和游戏开发里法线贴图是同时兼顾面数控制和细节表达的关键贴图。一张低模网格只需要几千个三角形配合法线贴图后就能在表面光照里出现原本需要十几倍面数才能呈现的砖缝、划痕和铆钉棱角。常规做法包括从高度图转换、从高模烘焙或者用带法线生成功能的图像插件。最近多模态大模型开始被当作法线贴图生成工具使用Gemini 3 Pro 就是这类试图直接根据输入图片输出法线贴图的模型代表。这里不讨论模型口径而是站在实际开发的角度完整梳理从准备输入图、写提示词、调用模型、保存结果、接入渲染管线到排查常见问题的全过程。最后会得到一条可复用的验证清单避免生成图看起来正常放进引擎里却光照错误。1. 先搞清楚法线贴图它存的是什么为什么不能当普通图片用1.1 法线贴图解决的是低模与高模之间的视觉差距一个典型场景是室外砖墙。如果只把一张彩色砖墙图片贴到平面上斜着看时墙面仍然很平光照也看不出砖块的凸起和缝隙。要让低模表现真实体积过去只能增加模型面数把每块砖的厚度都建模出来。法线贴图换了一种思路不改变网格只改变表面每个像素的“朝向”。渲染器在计算光照时不使用网格原本的法线而是读取贴图里记录的法线方向。于是低模也能出现高模的光照效果。这里的关键在于“记录方向”而不是“记录亮度”。高度图记录的是隆起高度法线贴图记录的是每个点朝向哪个方向。把法线贴图当成普通图片直接用眼睛看通常是一张偏蓝紫色的图这正是它和漫反射贴图最大的区别。1.2 RGB 三个通道的含义和颜色约定法线贴图最常见的存储方式是切线空间。每个像素的三个通道分别对应一个三维向量的 XYZ 分量向量方向代表该点的表面法线。R 通道对应 X 轴表示法线在水平方向上的偏移。G 通道对应 Y 轴表示法线在垂直方向上的偏移。B 通道对应 Z 轴表示法线朝上远离表面的程度。当表面平整、法线垂直向上时向量的分量接近 (0, 0, 1)。用 8 位无符号整数存储0 到 1 的数值映射为 0 到 255所以 (0, 0, 1) 对应的像素颜色是 (128, 128, 255)也就是常说的“法线贴图整体偏蓝紫色”。如果整张贴图都接近这个颜色说明表面非常平整如果某一块区域出现了大量红色或绿色说明该区域法线在水平或垂直方向有明显偏移光照会产生立体感。1.3 DirectX 和 OpenGL 的方向约定要注意不同渲染后端对法线贴图的 G 通道方向有不同约定。DrectX 风格通常使用左手法则OpenGL 风格使用右手法则二者对绿色通道的解析方向相反。同一个模型在 Blender 里显示正常导入 Unreal 后凹凸方向可能反转就是这个原因。系统常见约定异常表现DirectX 风格G 通道保持正向在 OpenGL 风格渲染器里凹凸方向反转OpenGL 风格G 通道需要翻转在 DirectX 风格渲染器里凹凸方向反转因此AI 生成法线贴图后验证方向是否一致是必须步骤不能假设模型输出一定适配某个引擎。1.4 为什么 AI 生成法线贴图不能只看“像不像”评价一张 AI 生成的法线贴图不能只开会看缩略图。原因有两点第一法线贴图需要数值关系正确。像不像是一种视觉感受但渲染器关心的是每个像素的数值方向。如果 G 通道被翻转凹凸会在另一些引擎里反向视觉上可能觉得“有点怪”但很难直接指出问题。第二法线贴图要匹配具体的坐标空间约定。DirectX 风格和 OpenGL 风格在绿色通道方向上有差异。生成时如果不指定约定模型可能输出两者中的任意一种接入引擎后需要验证和调整。所以使用 AI 生成法线贴图时提示词要强调“切线空间”“默认方向为 Z 轴向上”“平坦区域为 (128, 128, 255)”这些约束比“生成一张好看的法线贴图”更有效。2. 传统法线贴图生成方式和 AI 方案的差异2.1 三种常见传统生成路径传统工作流主要可以分成几条路线。从高度图转换。用 Photoshop 或 Substance Designer 的 Height to Normal 节点把灰度高度图转换为法线贴图。优点是简单快捷缺点是只能表达高度变化产生的斜度无法表达悬空、倒角、材质边缘等复杂细节。从高模烘焙。先建一个高模再在低模上烘焙法线信息。这是游戏资产生产里的标准做法效果最好但准备高模、展 UV、对位低模的工作量很大。从照片提取。使用 CrazyBump、Photoshop 的法线滤镜等工具根据照片光影信息生成法线贴图。对砖墙、岩石这类无规则表面效果尚可对硬边物体误差较大。这些方式有一个共同点都需要已经存在的几何信息或图像信息并且后续要人工检查、清理、修补。2.2 多模态大模型介入后工作流的变化Gemini 3 Pro 这类多模态模型如果被用于生成法线贴图改变的是“输入到输出之间的映射方式”。它不在本地计算高度梯度也不需要高模而是依靠训练时见过的图像分布推断出输入图片对应的表面朝向信息。对开发者来说工作流变成了准备一张输入图可以是漫反射贴图、真实照片也可以是灰阶高度图。用提示词描述目标输出法线贴图指定颜色约定、格式和细节强度。模型返回一张图像。开发者把图像接入渲染管线验证。这个流程更适合快速原型、风格化资产、灵感草稿验证以及样本量很大的批量贴图场景。需要强调的是生成结果的可靠性和局部精度仍然受到模型能力限制并不等于传统高模烘焙的替代品。2.3 传统方案与 AI 方案的选型对比维度高度图转换高模烘焙AI 生成以 Gemini 3 Pro 为例输入要求需要可用的灰阶高度图需要高模和低模且 UV 对齐可以用漫反射图、照片或高度图生成速度快慢需建模准备和烘焙等待较快取决于 API 返回速度细节精度只能表达高度梯度最高可表达硬边和自阴影取决于模型训练分布硬边可能不稳可控性通过高度图参数控制通过高模细节控制通过提示词和输入图控制PBR 匹配度一般高中等需要验证通道方向和细节适用场景地形、布料等柔和表面角色、机械、硬表面资产快速原型、风格化资产、批量草稿选型的核心判断是项目对细节精度要求越高越不能完全依赖 AI 生成结果项目追求速度和多样化草稿AI 生成是值得加入工作流的工具。3. 用 Gemini 3 Pro 生成法线贴图的最小流程3.1 输入贴图的准备无论模型能力多强输入图质量都直接影响法线结果。建议遵循以下准备顺序优先使用干净的漫反射贴图或照片分辨率不低于 1024x1024。去除输入图中的明显光照和阴影。如果输入照片里有强方向性光源模型可能把阴影当作凹凸信息生成错误的法线方向。如果要做无缝平铺材质输入图首先要保证四边接缝连续。如果要生成特定材质的法线输入图里不要混入多种材质砖墙图里出现大面积金属管道会让模型难判断。准备阶段最容易犯的错误是直接使用一张带水印、带 UI 图标或者带文字标注的截图。模型会把文字和图形误识别为表面结构法线贴图里会出现奇怪的凸起。3.2 提示词的组成贴图类型加空间约定加输出要求提示词不要只写“生成 normal map”。好的提示词应该包含四类信息输出目标明确写出“法线贴图”而不是“高度图”“粗糙度图”。坐标空间和颜色约定写明“切线空间法线贴图平坦区域朝上RGB 颜色接近 (128, 128, 255)”。细节强度说明“保留砖缝、细小颗粒感不要过度平滑”。输出格式写明“输出一张 PNG 图片不要附加文字说明不要添加背景”。示例提示词如下把输入图像转换为一张可用的切线空间法线贴图。平坦区域的法线应朝向 Z 轴颜色接近 (128, 128, 255)。需要保留砖块缝隙、表面颗粒和边缘轮廓细节。只输出图片本身不要附加解释、边框、背景或水印。这个写法把“颜色约定”写进提示词是为了减少模型把结果输出成灰度图或风格化贴图的概率。3.3 调用模型与实际保存的通用流程不同模型的 API 参数存在差异下面代码只演示调用结构实际调用前需要确认当前模型的图片输入、图片输出能力和具体模型标识。import base64 import google.generativeai as genai genai.configure(api_keyYOUR_API_KEY) # 模型标识以官方文档为准 model genai.GenerativeModel(gemini-3-pro) image_path brick_wall_diffuse.png with open(image_path, rb) as f: image_data base64.b64encode(f.read()).decode(utf-8) prompt ( 把这张漫反射贴图转换成切线空间法线贴图。 平坦区域朝上颜色接近 (128, 128, 255)。 保留砖缝和表面颗粒细节。 只输出 PNG 图片不要附加文字、边框、背景或水印。 ) response model.generate_content( [ {mime_type: image/png, data: image_data}, prompt ] ) # 检查响应中是否包含图片内容 for part in response.candidates[0].content.parts: if hasattr(part, inline_data) and part.inline_data: with open(brick_wall_normal.png, wb) as f_out: f_out.write(part.inline_data.data) print(已保存 brick_wall_normal.png) break这段示例的关键点有三个。第一图片以 base64 形式传给模型确保编码前后的字节一致。第二提示词要放在图片内容之后模型会先理解输入图再按提示词处理。第三响应可能是文本和图片混合的必须遍历 parts找到图片类型的内容再保存。如果 API 只支持文本输出那么生成的图片可能以 base64 字符串或文件链接返回保存方式需要按实际响应结构处理。3.4 保存后先做数值检查再决定是否进入渲染管线生成结果保存后不要直接拖进 Blender。先用脚本检查几个基本数值能避免大部分接入问题。from PIL import Image import numpy as np img Image.open(brick_wall_normal.png).convert(RGB) arr np.asarray(img, dtypenp.float32) / 255.0 r, g, b arr[:, :, 0], arr[:, :, 1], arr[:, :, 2] print(尺寸:, img.size) print(R 通道均值:, round(float(r.mean()), 3)) print(G 通道均值:, round(float(g.mean()), 3)) print(B 通道均值:, round(float(b.mean()), 3)) print(中心像素 RGB:, img.getpixel((img.width // 2, img.height // 2))) # 如果三通道均值接近且 B 通道明显偏低说明更像灰度高度图 if abs(r.mean() - g.mean()) 0.03 and abs(b.mean() - 0.9) 0.1: print(提示: B 通道均值与 0.9 有明显差异需要确认是否为法线贴图)正常法线贴图的 B 通道均值通常在 0.8 以上R 和 G 通道围绕 0.5 波动。如果 R、G、B 均值几乎一样生成的很可能是灰度图需要回到提示词环节调整。脚本里的阈值只是示意不同资产可以按实际效果调整。4. 把生成结果接回渲染管线的验证方法4.1 在 Blender 中加载法线贴图Blender 中加载法线贴图有两个容易踩坑的设置颜色空间必须设置为 Non-Color并要通过 Normal Map 节点连接到 BSDF 的 Normal 输入。import bpy mat bpy.data.materials.new(BrickWallNormalMat) mat.use_nodes True bsdf mat.node_tree.nodes[Principled BSDF] tex_node mat.node_tree.nodes.new(ShaderNodeTexImage) tex_node.image bpy.data.images.load(//brick_wall_normal.png) tex_node.image.colorspace_settings.name Non-Color normal_map_node mat.node_tree.nodes.new(ShaderNodeNormalMap) mat.node_tree.links.new( tex_node.outputs[Color], normal_map_node.inputs[Color] ) mat.node_tree.links.new( normal_map_node.outputs[Normal], bsdf.inputs[Normal] )Blender 使用 OpenGL 风格约定如果生成图来自不同的约定可能需要在 Normal Map 节点里调整方向参数。验证时放一个强方向性光源和一个参考球观察光照是否从预期方向产生凹凸。4.2 Unity 和 Unreal 的导入设置Unity 和 Unreal 导入法线贴图时有各自的设置要求。引擎导入设置说明UnityTexture Type 选 Normal map不要勾选 Create from Grayscale那是给高度图用的UnitysRGB 关闭Unity 对 Normal map 类型会自动处理UnrealCompression 选 Normalmap指定压缩格式为法线贴图专用格式UnrealsRGB 关闭法线贴图是数据贴图不应按 sRGB 颜色空间解释如果引擎使用了不同的绿色通道方向可以在导入设置里找到翻转绿色通道选项。翻转向量方向时法线贴图的凹凸方向会反向视觉上表现为凸起变凹陷。4.3 通过 glTF 示例检查材质接入如果项目使用 glTF 格式法线贴图通过 normalTexture 字段引用。下面是一个完整度较低的简化 JSON只展示核心结构。{ asset: {version: 2.0}, images: [ {uri: brick_wall_diffuse.png}, {uri: brick_wall_normal.png} ], textures: [ {source: 0}, {source: 1} ], materials: [ { name: BrickWall, pbrMetallicRoughness: { baseColorTexture: {index: 0}, metallicFactor: 0.0, roughnessFactor: 0.9 }, normalTexture: {index: 1, scale: 1.0} } ] }glTF 规范里渲染器默认使用切线空间的法线贴图。如果引擎读不到切线信息某些运行时可能表现异常需要在网格数据里提供 tangent 属性。4.4 接入后的验证清单验证不能只看缩略图。建议按以下顺序检查在材质里放一个明确的参考模型比如带网格划分的圆球方便观察光照方向。用平行光从左上角照射确认凸起区域产生左上亮、右下暗的光照。旋转相机确认凹凸方向是否随视角稳定而不是像贴花一样漂移。在 UV 接缝处检查是否有明显断裂如果断裂严重说明生成时没有满足无缝平铺要求。检查边缘和重复平铺后的连续性。记录生成时使用的提示词、输入图分辨率和输出尺寸便于后续复现。5. 常见问题与排查链路5.1 生成结果看起来像灰度图接进引擎没有凹凸现象输出图的 RGB 三个通道数值非常接近整体是灰色而不是偏蓝紫色。接入引擎后材质表面完全平整光照没有变化。可能原因模型把输入图当成了高度图处理输出了高度信息而不是法线方向或者提示词没有明确“切线空间法线贴图”和“平坦区域朝上”。处理方式回到提示词加入颜色约定描述例如“平坦区域颜色为 (128, 128, 255)”并明确“不要输出高度图”。5.2 凹凸方向反了砖缝看起来往外鼓而不是往里凹现象在某个引擎里凸起和凹陷的视觉方向与预期相反。可能原因法线贴图的绿色通道约定不匹配。DirectX 和 OpenGL 对 G 通道方向约定不同同一张贴图在两个体系里会呈现相反凹凸。处理方式在引擎导入设置中翻转绿色通道或者在纹理节点里对 G 通道取反。验证方法是把一个已知凸起区域放到光照下观察方向是否一致。5.3 接缝处出现明显的断裂或棱线现象贴图平铺后每块砖的重复边界出现明显高光差异。可能原因输入图本身不是无缝贴图四边没有对齐模型生成时没有理解“seamless tileable”需求。处理方式先用图片工具把输入图处理成无缝贴图再在提示词中加入“保证四边无缝平铺”的描述。如果仍然断裂可以在渲染后期用接缝修复节点或外部工具处理。5.4 模型返回的不是图片或者图片解析失败现象API 返回了文本说明或者保存的图片无法打开。可能原因当前模型版本不支持图片输出响应结构里图片数据不是直接字节而是链接解析 parts 的逻辑没有覆盖真实结构。处理方式先打印响应结构的 JSON确认图片内容在哪个字段。如果是链接用下载逻辑获取文件。如果模型确实不支持图片输出需要换用支持图片输出的模型或改用文生图工作流。5.5 排查顺序与预防建议遇到法线贴图失效时建议按这个顺序排查先检查数值B 通道是否接近 1.0R/G 通道是否围绕 0.5 波动。再检查导入设置是否被当成 sRGB 颜色空间或普通纹理。再检查节点连接法线贴图是否通过 Normal Map 节点接入。再检查方向约定是否需要在渲染器里翻转绿通道。再检查输入图原图是否带光照、水印或接缝。最后检查生成参数提示词是否写清了坐标空间、细节强度和输出格式。预防层面上建议把每次成功生成的提示词、输入图、输出图、引擎设置存成一张记录表。后续如果某个项目出现方向问题可以直接对比记录快速定位是生成环节还是接入环节的错误。6. 实际项目里的最佳实践与扩展方向6.1 适合用 AI 生成法线贴图的场景AI 生成法线贴图不是替代高模烘焙而是适合以下场景快速原型阶段。美术想要在两天内看到多种砖墙、岩石、地面材质的凹凸效果AI 生成可以快速提供候选贴图。风格化资产。卡通风、低多边形风格对法线精度的要求低于写实 PBRAI 生成结果通常够用。非关键资产。远景环境、背景道具等不需要近距离特写的资产可以用 AI 生成结果。批量草稿。需要为一批材质生成初始法线贴图再在 Substance 或 Photoshop 中人工修正的场景。在这些场景中AI 生成的价值是缩短“从想法到可渲染”的时间而不是消除人工验证环节。6.2 不适合的场景与底线以下场景不建议只依赖 AI 生成角色面部和手部等需要精细结构控制的资产。需要严格匹配高模自阴影、倒角和硬边的机械零件。有明确产品要求或客户审核要求的商业资产AI 结果的可解释性和可复现性不足。需要支持极端特写镜头的资产局部细节一旦出错会很显眼。遇到这些情况应继续使用高模烘焙或手工绘制法线贴图把 AI 生成结果当作草图参考而不是最终纹理。6.3 接入 PBR 工作流前的检查清单在把 AI 生成的法线贴图并入正式 PBR 材质前建议完成以下检查分辨率是否匹配目标资产低分辨率放大贴图会导致细节模糊。是否已经设置为非颜色数据或法线贴图导入类型。是否在接入前清理了边缘 alpha 和多余背景。是否记录了生成时的提示词和输入图方便后续复现和调整。是否在最终渲染前用一盏强光检查过凹凸方向。是否处理了接缝保证平铺后没有重复棱线。6.4 扩展方向修复、约束与批量生成如果希望把 AI 生成法线贴图真正用于生产
返回列表