@@ -2,6 +2,7 @@ import { equirectUV } from '../../nodes/utils/EquirectUVNode.js';
2
2
import { texture as TSL_Texture } from '../../nodes/accessors/TextureNode.js' ;
3
3
import { positionWorldDirection } from '../../nodes/accessors/Position.js' ;
4
4
import NodeMaterial from '../../materials/nodes/NodeMaterial.js' ;
5
+ import { blur , getBlurParams } from '../../../nodes/pmrem/PMREMUtils.js' ;
5
6
6
7
import { WebGLCubeRenderTarget } from '../../renderers/WebGLCubeRenderTarget.js' ;
7
8
import { Scene } from '../../scenes/Scene.js' ;
@@ -73,32 +74,60 @@ class CubeRenderTarget extends WebGLCubeRenderTarget {
73
74
74
75
}
75
76
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 ) ) ;
78
83
79
84
const geometry = new BoxGeometry ( 5 , 5 , 5 ) ;
80
85
81
86
const blurMaterial = new NodeMaterial ( ) ;
82
- blurMaterial . colorNode = TSL_CubeTexture ( cubeMap , positionWorldDirection , 0 ) ;
83
87
blurMaterial . side = BackSide ;
84
88
blurMaterial . depthTest = false ;
85
89
blurMaterial . depthWrite = false ;
86
90
blurMaterial . blending = NoBlending ;
87
91
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
+
88
104
const mesh = new Mesh ( geometry , blurMaterial ) ;
89
105
90
106
const scene = new Scene ( ) ;
91
107
scene . add ( mesh ) ;
92
108
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 ;
94
117
95
118
camera . update ( renderer , scene ) ;
96
119
97
120
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 ;
98
127
99
128
camera . update ( renderer , scene ) ;
100
129
101
- blurTarget1 . dispose ( ) ;
130
+ blurTarget . dispose ( ) ;
102
131
}
103
132
104
133
}
0 commit comments