如何正确编码 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,同时保留其他网格和纹理的编码?的主要内容,如果未能解决你的问题,请参考以下文章