【问题标题】:preprocessing an environment map with PMREMGenerator使用 PMREMGenerator 预处理环境图
【发布时间】:2021-04-06 02:25:55
【问题描述】:

我正在尝试了解如何使用 PMREMGenerator. 正确预处理 envMaps

我现在的情况:

我在设置场景后立即创建一个 PMREM,并编译它的 equirectangular 着色器(我不清楚编译步骤,但这是我在示例中看到的):

 this.mPmremGenerator = new THREE.PMREMGenerator(this.mRenderer);
this.mPmremGenerator.compileEquirectangularShader();

接下来,我使用 TextureLoader 加载 envmap 纹理,并在其回调中使用fromEquirectangular 将 envmap 预处理为 RenderTarget,并从中提取新纹理并返回。

private preprocessEnvMap(pEnvMap: Texture) { 
     const WorldContext.mainScene.pmremGenerator;
     return aPmremGenerator.fromEquirectangular(pEnvMap).texture;
}

最后,我获取返回的纹理,将其指定为我的材质的envMap,并调用材质的needsUpdate = true

结果是我得到一个着色器错误:

THREE.WebGLProgram: shader error:  0 35715 false gl.getProgramInfoLog No compiled fragment shader when at least one graphics shader is attached.

我们将不胜感激,

谢谢

编辑:

这是我将PMREMGenerator 与标准材料一起使用的示例: https://codepen.io/tfreifeld/pen/OJWgdem

您可以看到背景中的图像和 envmap 中的图像都是模糊的。

这是原图:

https://imgur.com/a/M2mwNFa

【问题讨论】:

    标签: three.js


    【解决方案1】:

    (我不清楚编译步骤,但这就是我在示例中看到的):

    这样做是为了预编译内部着色器。否则,生成器在处理环境贴图时必须这样做。所以调用compileEquirectangularShader() 只是将一些工作分配给应用程序启动。

    接下来,我使用 TextureLoader 加载 envmap 纹理,在其回调中,我使用 fromEquirectangular 将 envmap 预处理为 RenderTarget,并从中提取新纹理并返回。

    请记住,您应该使用带有 HDR 纹理的 PMREMGenerator 以获得最佳质量(尽管这不是强制性的)。因此,您可能想要使用RGBELoaderRGBMLoaderEXRLoader 而不是TextureLoader 以及相应的HDR 纹理的设置。

    最后,我获取返回的纹理,将其分配为我的材质的 envMap,并调用材质的 needsUpdate = true。

    不必将needsUpdate 设置为true

    如果仍然弹出错误,我建议您通过一个现场示例演示该问题(以便可以调试该问题)。

    【讨论】:

    • 所以假设我的纹理没有/不需要 HDR 图像,我不应该使用PMREMGenerator?正规流程应该够了吧?或者现在必须使用生成器才能让 envmap 正确处理 PBR 材质?
    • 您可以将生成器与 LDR 纹理一起使用,但它看起来不如使用 HDR 工作流程时那么好。但是,在使用像 MeshStandardMaterial 这样的 PBR 材质时,需要使用 PMREMGenerator 的一般用法。
    • 好的。非常感谢。我将努力提供一个活生生的例子。我当前的问题发生在一个复杂的项目中。我希望我能够在一个紧凑的例子中复制这个问题。
    • 哇,对不起,我错误地将我的编辑添加到您的答案而不是我的问题中。我在任何地方都没有找到取消选项...我没有将它添加到我的问题中。
    • 是的,使用PMREMGenerator的输出时背景模糊。这是预期的行为。我也没有在浏览器控制台中看到提到的着色器错误。
    猜你喜欢
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 2016-04-21
    • 2011-07-01
    • 1970-01-01
    相关资源
    最近更新 更多