glb模型在Cesium中发黑的机理分析
最近在将一款火箭模型(fbx模式转换为glb(gltf)格式后在Cesium中加载结果模型看起来全黑经过分析发现是由于高光的折射率等级(IOR level)默认设置错误(设置为0)导致的将其设置为0.5即可在Cesium中表现正常。现象现有一个fbx格式的模型使用blender 4.5导入模型显示正常。不过需要注意的是模型的大部分都采用BSDF材质其基础设置为基础色灰白色金属度1糙度0.86折射率(IOR): 1.5高光/折射率等级IOR level): 0.0随后使用blender默认的“导出”-“gltf 2.0导出的gltf文件在visual studio code中打开借助gltf Tools插件可在vsc的扩展商店里安装。vsc中选中导出的gltf文件然后可以预览3D模型gltf Tools插件提供四种3D框架Babylon.js,Cesium,Filament,Three.js。其它三种都可以正常显示唯独Cesium显示基本是黑色的没有反光且在gltf文件里包含扩展: KHR_materials_specular且在材质里其扩展的specularFactor都为0见下图。经查询和测试在Blender中将材质的 -高光/折射率等级IOR level): 设置为0.5即可。此时导出的gltf中不再有 KHR_materials_specular扩展Cesium中显示也正常了见下图机理分析这是一个非常典型的 PBR物理渲染工作流兼容性问题。1. 为什么高光的 IOR Level 0 会导致 Cesium 变黑数学逻辑 在 Blender 4.0 中IOR Level 是对物理反射率的缩放。设为 0 意味着该物体完全不反射光线反射率F00F0 0F00。glTF 扩展 导出时Blender 为了保留这个“不反光”的特性必须使用 KHR_materials_specular 扩展并将 specularFactor 设为 0。渲染器差异Cesium 严格遵循物理公式。如果反射系数为 0且没有环境光补偿Cesium的背景环境为黑色宇宙星空物体表面无法产生任何高光和环境反射导致视觉上呈现死黑尤其是边缘处。Three.js / Babylon.js 它们通常有更激进的环境光补偿 (Ambient Light) 或默认的漫反射增强。即使高光反射率为 0它们也会用环境光强行把物体“照亮”让你看到 Base Color。2. 为什么 IOR Level 0.5 就正常了回归标准 在 glTF 标准中非金属的默认反射率被固定在 4%对应 IOR 1.5。消除扩展 当你在 Blender 中设置 IOR Level 0.5 时正好符合 glTF 的默认标准值。导出器认为不需要额外修正因此不再写入 KHR_materials_specular 扩展。兼容性飞跃 此时 Cesium 使用最基础的 Metallic-Roughness 逻辑进行渲染。即使没有环境贴图基础的光照计算也能正常运作不会出现因参数极端导致的黑块。Blender 材质设置的标准“黄金法则”为了确保模型在 Cesium、Three.js 等所有引擎中表现一致建议在 Blender 中遵循以下设置1. 材质节点 (Principled BSDF) 设置IOR (折射率) 始终保持在 1.45 ~ 1.50 之间这是绝大多数现实物质的物理值。IOR Level (高光级别) 始终保持为 0.5。注如果你觉得反光太强调高 Roughness粗糙度而不是调低 IOR Level。Metallic (金属度)涂漆/塑料/木头 必须设为 0。裸露金属 设为 1。Base Color (基础色) 不要使用纯黑或纯白。建议使用 V 0.1~0.8 之间的灰色/彩色。Cesium 端的配套优化即便模型导出正确Cesium 默认的光照依然偏弱。建议在代码中加入. 开启 HDR viewer.scene.highDynamicRange true; 让色彩更丰富防止背光面死黑。总结建议在 Blender 中请将 IOR 保持 1.45IOR Level 保持 0.5。如果想要物体看起来“不那么亮”请通过 增加 Roughness粗糙度 或 调暗 Base Color基础色 来实现而不是通过把 IOR 归零。这样导出的 GLB 文件结构最简洁在 Cesium 中的兼容性也最好。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2478273.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!