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

How can I properly encode a GLTF while also preserving the encoding of other meshes and textures?

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

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

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

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

THREE.GLTFLoader 假设您使用的是线性工作流程,并且需要 renderer.outputEncoding = THREE.sRGBEncoding(或等效的 post-处理)来配置材质和纹理。听起来你的场景的其余部分是为伽玛工作流程配置的。为了使这些一致,您可能需要遍历整个场景(包括 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——如果你想对“伽玛工作流程”使用线性输出编码。如果场景中有很多其他内容,这可能会更容易。