我正在努力理解如何用envMaps正确地预处理PMREMGenerator.
我的现状:
我在设置场景后立即创建一个PMREM,并编译它的等长线着色器(我不清楚编译步骤,但这是我在示例中看到的):
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中的图像都是模糊的。
这是原图:
发布于 2021-04-05 08:31:14
(我不清楚编译步骤,但这就是我在示例中看到的):
这是为了预编译内部着色器。否则,生成器在处理环境映射时必须这样做。因此,调用compileEquirectangularShader()
只会将一些工作分发给应用程序启动。
接下来,我使用TextureLoader加载envmap纹理,在其回调中,我使用fromEquirectangular将envmap预处理为RenderTarget,并从中提取新纹理并返回它。
请记住,您应该使用PMREMGenerator
与HDR纹理,以获得最好的质量(虽然它不是强制性的)。因此,您可能需要一个设置,其中您使用RGBELoader
,RGBMLoader
或EXRLoader
,而不是TextureLoader
以及各自的HDR纹理。
最后,我取返回的纹理,将其赋值为我的材料的envMap,并调用材料的needsUpdate = true。
不需要将needsUpdate
设置为true
。
如果错误仍然弹出,我建议您用一个活示例演示这个问题(因此可以调试该问题)。
https://stackoverflow.com/questions/66949741
复制相似问题