three.js - 使用 PMREMGenerator 预处理环境贴图

标签 three.js

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

我目前的情况:

我在设置场景后立即创建一个 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;
}

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

结果是我收到着色器错误:

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

非常感谢您的帮助,

谢谢

编辑:

这是我将 PMREMGenerator 与标准 Material 结合使用的示例: https://codepen.io/tfreifeld/pen/OJWgdem

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

这是原图:

/image/fFNqH.jpg

最佳答案

(that compile step is not clear to me, but that's what I've seen in examples):

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

Next, I use TextureLoader to load the envmap texture, and in its callback, I use fromEquirectangular to preprocess the envmap into a RenderTarget, and extract the new texture from it and return it.

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

Finally, I take the returned texture, assign it as my material's envMap, and call the material's needsUpdate = true.

不必将 needsUpdate 设置为 true

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

关于three.js - 使用 PMREMGenerator 预处理环境贴图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66949741/

相关文章:

javascript - TypeError : Cannot read property 'center' of undefined (Three. js + React.js)

javascript - 三 Angular 测量Three.js算法

three.js - 在 Three.js 中将图像转换为点云

javascript - 4点图像变换

three.js - ThreeJS中阴影黑暗的替代方案

javascript - 每个客户端的 meteor 同步内容

javascript - 如何使用来自 Github 的 THREE.JS 源和图像文件制作 Sprite 的 JSFiddle?

javascript - 如何在 Three.js 中将 2d 路径转换为 ​​3d 形状?

javascript - angularJS中的WebGL ThreeJS和PhysiJS无法启动物理?

javascript - JSON 图像 url 而不是 base64