法线贴图格式 DirectX OpenGL
先核对绿色通道约定
Adobe 官方 FAQ 使用常见命名:OpenGL Y+、DirectX Y-,差异在绿色通道的解释。这个标签不能简化成任何屏幕坐标下固定的“向上/向下”;讨论方向时,需要明确纹理坐标与切线基底。最终应以来源工具和目标应用的实际约定为准。
不要靠色调或平坦区域判断
法线贴图整体颜色取决于表面方向,不能凭某种色调决定格式。平坦切线空间法线 (0,0,1) 常被编码为约 (128,128,255),两种约定都可能呈现这种颜色。8 位量化下,绿色中点反相会在 127 与 128 间变化,这个差别也不能用来认定来源格式。
转换的是分量,不是整张图片方向
确认约定不匹配后,绿色通道反相为 G_new=1-G;8 位图像为 G_new=255-G。整张图片上下翻转会改变像素与 UV 的对应,不等同于反相绿色通道。源图转换与引擎导入设置只选一处执行,避免二次反相。
同一模型的可复现检查流程
- 保留原图,记录来源工具、导出约定、目标应用版本以及当前导入选项。
- 用同一模型、相同 UV、三角化、切线、材质与灯光,仅改变绿色通道反相设置。
- 观察已知朝向的凹凸细节,确认差异;如果两种结果都不对,再核对切线基底、法线纹理类型与压缩等因素。
- 记录最终选项与结果,不用运行时图形 API 的名称替代实际验证。
Unity 文档提供 Flip Green Channel 选项,含义是反转绿色 (Y) 通道值。针对具体版本和其他引擎,请按其导入文档验证,不假定会可靠识别来源约定。
资料来源
常见问题
DirectX 和 OpenGL 法线贴图有什么区别?
常见切线空间命名为 OpenGL Y+、DirectX Y-,区别在绿色通道约定;应查清来源工具与目标应用,而不是只看运行的图形 API。
能从颜色判断格式吗?
不能凭整体色调或平坦区域判断。常见平坦法线 (0,0,1) 在 8 位编码中约为 (128,128,255),两种约定都可出现;应以导出设置与同一模型的对照渲染为准。
如何转换绿色通道约定?
只在确认约定不匹配时对绿色通道反相:归一化 G_new=1-G,8 位 G_new=255-G。像素上下翻转不是这项转换;源图与导入器不要同时反相,否则发生二次反相。
导入前还要核对什么?
按目标应用文档核对法线贴图类型与绿色通道设置,并检查 UV、三角化、切线基底和压缩。Unity 提供 Flip Green Channel 选项,但它不代替对来源约定的确认。