首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用PMREMGenerator对环境图进行预处理

用PMREMGenerator对环境图进行预处理
EN

Stack Overflow用户
提问于 2021-04-05 07:43:40
回答 1查看 1.2K关注 0票数 2

我正在努力理解如何用envMaps正确地预处理PMREMGenerator.

我的现状:

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

代码语言:javascript
运行
复制
 this.mPmremGenerator = new THREE.PMREMGenerator(this.mRenderer);
this.mPmremGenerator.compileEquirectangularShader();

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

代码语言:javascript
运行
复制
private preprocessEnvMap(pEnvMap: Texture) { 
     const WorldContext.mainScene.pmremGenerator;
     return aPmremGenerator.fromEquirectangular(pEnvMap).texture;
}

最后,我取返回的纹理,分配它作为我的材料的envMap,并调用材料的needsUpdate = true

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

代码语言:javascript
运行
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-05 08:31:14

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

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

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

请记住,您应该使用PMREMGenerator与HDR纹理,以获得最好的质量(虽然它不是强制性的)。因此,您可能需要一个设置,其中您使用RGBELoaderRGBMLoaderEXRLoader,而不是TextureLoader以及各自的HDR纹理。

最后,我取返回的纹理,将其赋值为我的材料的envMap,并调用材料的needsUpdate = true。

不需要将needsUpdate设置为true

如果错误仍然弹出,我建议您用一个活示例演示这个问题(因此可以调试该问题)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66949741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档