Skip to content

Commit 4c777e8

Browse files
committed
completed fromBlur
1 parent 05da83f commit 4c777e8

File tree

1 file changed

+34
-5
lines changed

1 file changed

+34
-5
lines changed

src/renderers/common/CubeRenderTarget.js

+34-5
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { equirectUV } from '../../nodes/utils/EquirectUVNode.js';
22
import { texture as TSL_Texture } from '../../nodes/accessors/TextureNode.js';
33
import { positionWorldDirection } from '../../nodes/accessors/Position.js';
44
import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
5+
import { blur, getBlurParams } from '../../../nodes/pmrem/PMREMUtils.js';
56

67
import { WebGLCubeRenderTarget } from '../../renderers/WebGLCubeRenderTarget.js';
78
import { Scene } from '../../scenes/Scene.js';
@@ -73,32 +74,60 @@ class CubeRenderTarget extends WebGLCubeRenderTarget {
7374

7475
}
7576

76-
fromBlur(renderer, cubeMap, sigma){
77-
const blurTarget1=new CubeRenderTarget(this.width);
77+
fromBlur(renderer, cubeMap, sigmaRadians, poleAxis=new Vector3(0, 1, 0)){
78+
// The maximum length of the blur for loop. Smaller sigmas will use fewer
79+
// samples and exit early, but not recompile the shader.
80+
const MAX_SAMPLES = 20;
81+
82+
const blurTarget=new CubeRenderTarget(Math.min(this.width, cubeMap.width));
7883

7984
const geometry = new BoxGeometry( 5, 5, 5 );
8085

8186
const blurMaterial = new NodeMaterial();
82-
blurMaterial.colorNode = TSL_CubeTexture(cubeMap, positionWorldDirection, 0);
8387
blurMaterial.side = BackSide;
8488
blurMaterial.depthTest = false;
8589
blurMaterial.depthWrite = false;
8690
blurMaterial.blending = NoBlending;
8791

92+
const weights = uniformArray( new Array( MAX_SAMPLES ).fill( 0 ) );
93+
const dTheta = uniform( 0 );
94+
const n = float( MAX_SAMPLES );
95+
const latitudinal = uniform( 0 ); // false, bool
96+
const samples = uniform( 1 ); // int
97+
const envMap = texture( null );
98+
99+
const cubeSampler=Fn(( [ sampleDirection ] )=>{
100+
return TSL_CubeTexture(envMap, sampleDirection, 0);
101+
});
102+
blurMaterial.fragmentNode = blur( { n, latitudinal: latitudinal.equal( 1 ), poleAxis: vec3(poleAxis), outputDirection: positionWorldDirection, weights, samples, dTheta, sampler: cubeSampler } );
103+
88104
const mesh = new Mesh( geometry, blurMaterial );
89105

90106
const scene = new Scene();
91107
scene.add( mesh );
92108

93-
const camera = new CubeCamera( 1, 10, blurTarget1 );
109+
const camera = new CubeCamera( 1, 10, blurTarget );
110+
111+
envMap.value=cubeMap.texture;
112+
latitudinal.value=1;
113+
const blurParams1=getBlurParams(sigmaRadians, cubeMap.width, MAX_SAMPLES);
114+
weights.value=blurParams1.weights;
115+
samples.value=blurParams1.samples;
116+
dTheta.value=blurParams1.radiansPerPixel;
94117

95118
camera.update( renderer, scene );
96119

97120
camera.renderTarget=this;
121+
envMap.value=blurTarget.texture;
122+
latitudinal.value=0;
123+
const blurParams2=getBlurParams(sigmaRadians, blurTarget.width, MAX_SAMPLES);
124+
weights.value=blurParams2.weights;
125+
samples.value=blurParams2.samples;
126+
dTheta.value=blurParams2.radiansPerPixel;
98127

99128
camera.update( renderer, scene );
100129

101-
blurTarget1.dispose();
130+
blurTarget.dispose();
102131
}
103132

104133
}

0 commit comments

Comments
 (0)