Three.js 用PMREMGenerator预处理环境地图

Three.js 用PMREMGenerator预处理环境地图,three.js,Three.js,我试图了解如何使用PMREMGenerator正确预处理envmap。 我目前的情况: 我在设置场景后立即创建PMREM,并编译其等矩形着色器(编译步骤我不清楚,但这是我在示例中看到的): 接下来,我使用TextureLoader加载envmap纹理,在其回调中,我使用fromEquirectangle将envmap预处理为渲染目标,并从中提取新纹理并返回它 private preprocessEnvMap(pEnvMap: Texture) { const WorldContext

我试图了解如何使用
PMREMGenerator正确预处理envmap。

我目前的情况:

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

接下来,我使用TextureLoader加载envmap纹理,在其回调中,我使用
fromEquirectangle
将envmap预处理为
渲染目标
,并从中提取新纹理并返回它

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
与标准材质一起使用:

您可以看到背景和环境贴图中的图像都很模糊

这是原始图像:

(我不清楚编译步骤,但我在示例中看到了这一点):

这样做是为了预编译内部着色器。否则,生成器在处理环境映射时必须执行此操作。因此,调用
compileeRequestAngularShader()
只会为应用程序的启动分配一些工作

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

private preprocessEnvMap(pEnvMap: Texture) { 
     const WorldContext.mainScene.pmremGenerator;
     return aPmremGenerator.fromEquirectangular(pEnvMap).texture;
}
请记住,您应该将
PMREMGenerator
与HDR纹理一起使用,以获得最佳质量(尽管这不是强制性的)。因此,您可能需要使用
RGBELoader
RGBMLoader
EXRLoader
而不是
TextureLoader
以及各自的HDR纹理的设置

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

不必将
needsUpdate
设置为
true


如果错误仍然弹出,我建议您用一个实例来演示这个问题(这样就可以调试这个问题)。

因此,假设我的纹理没有/不需要HDR图像,我不应该使用
PMREMGenerator
?常规程序应该足够了吗?或者现在必须使用生成器才能使envmaps在PBR材质上正常工作?您可以将生成器与LDR纹理一起使用,但它看起来不如使用HDR工作流时好。但是,当使用PBR材料(如
MeshStandardMaterial
)时,需要一般使用
PMREMGenerator
。确定。非常感谢你。我将努力提供一个实例。我目前的问题发生在一个复杂的项目中。我希望我能在一个简洁的例子中复制这个问题。哇,对不起,我错了,我在你的答案中添加了我的编辑,而不是我的问题。我在任何地方都找不到取消选项。。。我没有将其添加到我的问题中。是的,使用
PMREMGenerator
的输出时背景模糊。这是预期的行为。我在浏览器控制台中也没有看到提到的着色器错误。