Просмотр исходного кода

Nodes: Only use PMREM for background when blurriness is configured. (#29089)

* Nodes: Only use PMREM for background when blurriness is used.

* E2E: Update screenshots.

* CubeRenderTarget: Fix MRT support.

* E2E: Update screenshot.
Michael Herzog 1 год назад
Родитель
Сommit
94a841bed7

BIN
examples/screenshots/webgpu_clearcoat.jpg


BIN
examples/screenshots/webgpu_cubemap_adjustments.jpg


BIN
examples/screenshots/webgpu_cubemap_dynamic.jpg


BIN
examples/screenshots/webgpu_lightprobe.jpg


BIN
examples/screenshots/webgpu_loader_gltf.jpg


BIN
examples/screenshots/webgpu_loader_gltf_iridescence.jpg


BIN
examples/screenshots/webgpu_loader_gltf_sheen.jpg


BIN
examples/screenshots/webgpu_loader_materialx.jpg


BIN
examples/screenshots/webgpu_materials_basic.jpg


BIN
examples/screenshots/webgpu_materials_envmaps.jpg


BIN
examples/screenshots/webgpu_materials_transmission.jpg


BIN
examples/screenshots/webgpu_mrt.jpg


BIN
examples/screenshots/webgpu_parallax_uv.jpg


BIN
examples/screenshots/webgpu_postprocessing_3dlut.jpg


+ 6 - 0
src/renderers/common/CubeRenderTarget.js

@@ -54,8 +54,14 @@ class CubeRenderTarget extends WebGLCubeRenderTarget {
 		if ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter;
 
 		const camera = new CubeCamera( 1, 10, this );
+
+		const currentMRT = renderer.getMRT();
+		renderer.setMRT( null );
+
 		camera.update( renderer, scene );
 
+		renderer.setMRT( currentMRT );
+
 		texture.minFilter = currentMinFilter;
 		texture.currentGenerateMipmaps = currentGenerateMipmaps;
 

+ 26 - 2
src/renderers/common/nodes/Nodes.js

@@ -1,6 +1,7 @@
 import DataMap from '../DataMap.js';
 import ChainMap from '../ChainMap.js';
 import NodeBuilderState from './NodeBuilderState.js';
+import { cubeMapNode } from '../../../nodes/utils/CubeMapNode.js';
 import { NodeFrame, objectGroup, renderGroup, frameGroup, cubeTexture, texture, rangeFog, densityFog, reference, viewportBottomLeft, normalWorld, pmremTexture, viewportTopLeft } from '../../../nodes/Nodes.js';
 
 import { EquirectangularReflectionMapping, EquirectangularRefractionMapping } from '../../../constants.js';
@@ -264,13 +265,35 @@ class Nodes extends DataMap {
 
 		if ( background ) {
 
-			if ( sceneData.background !== background ) {
+			const forceUpdate = ( scene.backgroundBlurriness === 0 && sceneData.backgroundBlurriness > 0 ) || ( scene.backgroundBlurriness > 0 && sceneData.backgroundBlurriness === 0 );
+
+			if ( sceneData.background !== background || forceUpdate ) {
 
 				let backgroundNode = null;
 
 				if ( background.isCubeTexture === true || ( background.mapping === EquirectangularReflectionMapping || background.mapping === EquirectangularRefractionMapping ) ) {
 
-					backgroundNode = pmremTexture( background, normalWorld );
+					if ( scene.backgroundBlurriness > 0 ) {
+
+						backgroundNode = pmremTexture( background, normalWorld );
+
+					} else {
+
+						let envMap;
+
+						if ( background.isCubeTexture === true ) {
+
+							envMap = cubeTexture( background );
+
+						} else {
+
+							envMap = texture( background );
+
+						}
+
+						backgroundNode = cubeMapNode( envMap );
+
+					}
 
 				} else if ( background.isTexture === true ) {
 
@@ -284,6 +307,7 @@ class Nodes extends DataMap {
 
 				sceneData.backgroundNode = backgroundNode;
 				sceneData.background = background;
+				sceneData.backgroundBlurriness = scene.backgroundBlurriness;
 
 			}
 

粤ICP备19079148号