如何正确编码 GLTF,同时保留其他网格和纹理的编码?

Posted

技术标签:

【中文标题】如何正确编码 GLTF,同时保留其他网格和纹理的编码?【英文标题】:How can I properly encode a GLTF while also preserving the encoding of other meshes and textures? 【发布时间】:2022-01-07 08:10:21 【问题描述】:

我正在构建一个允许用户佩戴 GLTF 头部模型的网络 ar 应用。 (https://www.head5.camera/) 为了在 GLTF 上获得正确的照明,我设置了 renderer.outputEncoding = THREE.sRGBEncoding,这很好用,但它也从我的视频流中调整了我的 THREE.VideoTexture 的照明。有没有办法只对 GLTF 进行编码,但保留场景其余部分的 LinearEncoding?。非常感谢任何帮助。

这是我的意思的一个例子:

背景比预期的要亮,因为它也在被编码。

【问题讨论】:

【参考方案1】:

输出编码是渲染器级别的设置,不能针对特定对象或材质进行更改。因为您只能拥有一个 renderer.outputEncoding,所以您必须始终坚持使用 gamma 工作流程或线性工作流程 (background reading)。

THREE.GLTFLoader 假设您使用的是线性工作流程,并且需要 renderer.outputEncoding = THREE.sRGBEncoding(或等效的后处理)来配置材质和纹理。听起来您的场景的其余部分已配置为 gamma 工作流程。为了使它们保持一致,您可能需要遍历整个场景(包括 glTF 和任何其他模型/纹理)并配置相关纹理的色彩空间。

scene.traverse((object) => 
  if (object.isMesh) 
    const material = object.material;
    if (material.map) material.map.encoding = THREE.sRGBEncoding;
    if (material.emissiveMap) material.emissiveMap.encoding = THREE.sRGBEncoding;
    if (material.sheenColorMap) material.sheenColorMap.encoding = THREE.sRGBEncoding;
    if (material.specularColorMap) material.specularColorMap.encoding = THREE.sRGBEncoding;
  
);

通过这些更改,“线性工作流程”的 sRGB 输出编码看起来会正确。如果您想将线性输出编码用于“伽马工作流程”,您也可以执行相反的操作——将这些纹理切换为 THREE.LinearEncoding。如果场景中有很多其他内容,这可能会更容易。

【讨论】:

这完美解决了我的问题。非常感谢您抽出宝贵时间彻底回答。结果如下:head5.camera

以上是关于如何正确编码 GLTF,同时保留其他网格和纹理的编码?的主要内容,如果未能解决你的问题,请参考以下文章

Draco - glTF模型压缩利器

如何向 GLTF 模型添加光泽度/镜面反射纹理?

Threebox 和 Mapbox:为啥同一 GLTF 模型的连续实例上的纹理和形状会消失?

使用 GLTF 支持混合材质/纹理

三.js gltf模型变灰无纹理,改纹理后

Three.js:FBX 骨骼正确旋转,而 GLTF 骨骼奇怪地旋转