1
1
import {
2
- LinearFilter ,
3
2
LinearMipmapLinearFilter ,
4
3
MeshBasicMaterial ,
5
4
NoBlending ,
6
- RGBAFormat ,
7
5
ShaderMaterial ,
8
6
UniformsUtils ,
9
7
WebGLRenderTarget ,
10
8
} from 'three'
11
- import { Pass , FullScreenQuad } from '../postprocessing /Pass'
9
+ import { Pass , FullScreenQuad } from './Pass'
12
10
import { CopyShader } from '../shaders/CopyShader'
13
11
import { LuminosityShader } from '../shaders/LuminosityShader'
14
12
import { ToneMapShader } from '../shaders/ToneMapShader'
@@ -21,112 +19,103 @@ import { ToneMapShader } from '../shaders/ToneMapShader'
21
19
* Full-screen tone-mapping shader based on http://www.graphics.cornell.edu/~jaf/publications/sig02_paper.pdf
22
20
*/
23
21
24
- var AdaptiveToneMappingPass = function ( adaptive , resolution ) {
25
- this . resolution = resolution !== undefined ? resolution : 256
26
- this . needsInit = true
27
- this . adaptive = adaptive !== undefined ? ! ! adaptive : true
28
-
29
- this . luminanceRT = null
30
- this . previousLuminanceRT = null
31
- this . currentLuminanceRT = null
32
-
33
- if ( CopyShader === undefined ) console . error ( 'THREE.AdaptiveToneMappingPass relies on CopyShader' )
34
-
35
- var copyShader = CopyShader
36
-
37
- this . copyUniforms = UniformsUtils . clone ( copyShader . uniforms )
38
-
39
- this . materialCopy = new ShaderMaterial ( {
40
- uniforms : this . copyUniforms ,
41
- vertexShader : copyShader . vertexShader ,
42
- fragmentShader : copyShader . fragmentShader ,
43
- blending : NoBlending ,
44
- depthTest : false ,
45
- } )
46
-
47
- if ( LuminosityShader === undefined ) console . error ( 'THREE.AdaptiveToneMappingPass relies on LuminosityShader' )
48
-
49
- this . materialLuminance = new ShaderMaterial ( {
50
- uniforms : UniformsUtils . clone ( LuminosityShader . uniforms ) ,
51
- vertexShader : LuminosityShader . vertexShader ,
52
- fragmentShader : LuminosityShader . fragmentShader ,
53
- blending : NoBlending ,
54
- } )
55
-
56
- this . adaptLuminanceShader = {
57
- defines : {
58
- MIP_LEVEL_1X1 : ( Math . log ( this . resolution ) / Math . log ( 2.0 ) ) . toFixed ( 1 ) ,
59
- } ,
60
- uniforms : {
61
- lastLum : { value : null } ,
62
- currentLum : { value : null } ,
63
- minLuminance : { value : 0.01 } ,
64
- delta : { value : 0.016 } ,
65
- tau : { value : 1.0 } ,
66
- } ,
67
- vertexShader : [
68
- 'varying vec2 vUv;' ,
69
-
70
- 'void main() {' ,
71
-
72
- ' vUv = uv;' ,
73
- ' gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );' ,
74
-
75
- '}' ,
76
- ] . join ( '\n' ) ,
77
- fragmentShader : [
78
- 'varying vec2 vUv;' ,
79
-
80
- 'uniform sampler2D lastLum;' ,
81
- 'uniform sampler2D currentLum;' ,
82
- 'uniform float minLuminance;' ,
83
- 'uniform float delta;' ,
84
- 'uniform float tau;' ,
85
-
86
- 'void main() {' ,
87
-
88
- ' vec4 lastLum = texture2D( lastLum, vUv, MIP_LEVEL_1X1 );' ,
89
- ' vec4 currentLum = texture2D( currentLum, vUv, MIP_LEVEL_1X1 );' ,
90
-
91
- ' float fLastLum = max( minLuminance, lastLum.r );' ,
92
- ' float fCurrentLum = max( minLuminance, currentLum.r );' ,
93
-
94
- //The adaption seems to work better in extreme lighting differences
95
- //if the input luminance is squared.
96
- ' fCurrentLum *= fCurrentLum;' ,
97
-
98
- // Adapt the luminance using Pattanaik's technique
99
- ' float fAdaptedLum = fLastLum + (fCurrentLum - fLastLum) * (1.0 - exp(-delta * tau));' ,
100
- // "fAdaptedLum = sqrt(fAdaptedLum);",
101
- ' gl_FragColor.r = fAdaptedLum;' ,
102
- '}' ,
103
- ] . join ( '\n' ) ,
104
- }
105
-
106
- this . materialAdaptiveLum = new ShaderMaterial ( {
107
- uniforms : UniformsUtils . clone ( this . adaptLuminanceShader . uniforms ) ,
108
- vertexShader : this . adaptLuminanceShader . vertexShader ,
109
- fragmentShader : this . adaptLuminanceShader . fragmentShader ,
110
- defines : Object . assign ( { } , this . adaptLuminanceShader . defines ) ,
111
- blending : NoBlending ,
112
- } )
113
-
114
- if ( ToneMapShader === undefined ) console . error ( 'THREE.AdaptiveToneMappingPass relies on ToneMapShader' )
115
-
116
- this . materialToneMap = new ShaderMaterial ( {
117
- uniforms : UniformsUtils . clone ( ToneMapShader . uniforms ) ,
118
- vertexShader : ToneMapShader . vertexShader ,
119
- fragmentShader : ToneMapShader . fragmentShader ,
120
- blending : NoBlending ,
121
- } )
122
-
123
- this . fsQuad = new FullScreenQuad ( null )
124
- }
22
+ class AdaptiveToneMappingPass extends Pass {
23
+ constructor ( adaptive , resolution ) {
24
+ super ( )
25
+
26
+ this . resolution = resolution !== undefined ? resolution : 256
27
+ this . needsInit = true
28
+ this . adaptive = adaptive !== undefined ? ! ! adaptive : true
29
+
30
+ this . luminanceRT = null
31
+ this . previousLuminanceRT = null
32
+ this . currentLuminanceRT = null
33
+
34
+ const copyShader = CopyShader
35
+
36
+ this . copyUniforms = UniformsUtils . clone ( copyShader . uniforms )
37
+
38
+ this . materialCopy = new ShaderMaterial ( {
39
+ uniforms : this . copyUniforms ,
40
+ vertexShader : copyShader . vertexShader ,
41
+ fragmentShader : copyShader . fragmentShader ,
42
+ blending : NoBlending ,
43
+ depthTest : false ,
44
+ } )
45
+
46
+ this . materialLuminance = new ShaderMaterial ( {
47
+ uniforms : UniformsUtils . clone ( LuminosityShader . uniforms ) ,
48
+ vertexShader : LuminosityShader . vertexShader ,
49
+ fragmentShader : LuminosityShader . fragmentShader ,
50
+ blending : NoBlending ,
51
+ } )
52
+
53
+ this . adaptLuminanceShader = {
54
+ defines : {
55
+ MIP_LEVEL_1X1 : ( Math . log ( this . resolution ) / Math . log ( 2.0 ) ) . toFixed ( 1 ) ,
56
+ } ,
57
+ uniforms : {
58
+ lastLum : { value : null } ,
59
+ currentLum : { value : null } ,
60
+ minLuminance : { value : 0.01 } ,
61
+ delta : { value : 0.016 } ,
62
+ tau : { value : 1.0 } ,
63
+ } ,
64
+ vertexShader : `varying vec2 vUv;
65
+
66
+ void main() {
67
+
68
+ vUv = uv;
69
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
70
+
71
+ }` ,
72
+
73
+ fragmentShader : `varying vec2 vUv;
74
+
75
+ uniform sampler2D lastLum;
76
+ uniform sampler2D currentLum;
77
+ uniform float minLuminance;
78
+ uniform float delta;
79
+ uniform float tau;
80
+
81
+ void main() {
82
+
83
+ vec4 lastLum = texture2D( lastLum, vUv, MIP_LEVEL_1X1 );
84
+ vec4 currentLum = texture2D( currentLum, vUv, MIP_LEVEL_1X1 );
85
+
86
+ float fLastLum = max( minLuminance, lastLum.r );
87
+ float fCurrentLum = max( minLuminance, currentLum.r );
88
+
89
+ //The adaption seems to work better in extreme lighting differences
90
+ //if the input luminance is squared.
91
+ fCurrentLum *= fCurrentLum;
92
+
93
+ // Adapt the luminance using Pattanaik's technique
94
+ float fAdaptedLum = fLastLum + (fCurrentLum - fLastLum) * (1.0 - exp(-delta * tau));
95
+ // "fAdaptedLum = sqrt(fAdaptedLum);
96
+ gl_FragColor.r = fAdaptedLum;
97
+ }` ,
98
+ }
125
99
126
- AdaptiveToneMappingPass . prototype = Object . assign ( Object . create ( Pass . prototype ) , {
127
- constructor : AdaptiveToneMappingPass ,
100
+ this . materialAdaptiveLum = new ShaderMaterial ( {
101
+ uniforms : UniformsUtils . clone ( this . adaptLuminanceShader . uniforms ) ,
102
+ vertexShader : this . adaptLuminanceShader . vertexShader ,
103
+ fragmentShader : this . adaptLuminanceShader . fragmentShader ,
104
+ defines : Object . assign ( { } , this . adaptLuminanceShader . defines ) ,
105
+ blending : NoBlending ,
106
+ } )
107
+
108
+ this . materialToneMap = new ShaderMaterial ( {
109
+ uniforms : UniformsUtils . clone ( ToneMapShader . uniforms ) ,
110
+ vertexShader : ToneMapShader . vertexShader ,
111
+ fragmentShader : ToneMapShader . fragmentShader ,
112
+ blending : NoBlending ,
113
+ } )
114
+
115
+ this . fsQuad = new FullScreenQuad ( null )
116
+ }
128
117
129
- render : function ( renderer , writeBuffer , readBuffer , deltaTime /*, maskActive*/ ) {
118
+ render ( renderer , writeBuffer , readBuffer , deltaTime /*, maskActive*/ ) {
130
119
if ( this . needsInit ) {
131
120
this . reset ( renderer )
132
121
@@ -172,9 +161,9 @@ AdaptiveToneMappingPass.prototype = Object.assign(Object.create(Pass.prototype),
172
161
173
162
this . fsQuad . render ( renderer )
174
163
}
175
- } ,
164
+ }
176
165
177
- reset : function ( ) {
166
+ reset ( ) {
178
167
// render targets
179
168
if ( this . luminanceRT ) {
180
169
this . luminanceRT . dispose ( )
@@ -188,23 +177,18 @@ AdaptiveToneMappingPass.prototype = Object.assign(Object.create(Pass.prototype),
188
177
this . previousLuminanceRT . dispose ( )
189
178
}
190
179
191
- var pars = {
192
- minFilter : LinearFilter ,
193
- magFilter : LinearFilter ,
194
- format : RGBAFormat ,
195
- } // was RGB format. changed to RGBA format. see discussion in #8415 / #8450
196
-
197
- this . luminanceRT = new WebGLRenderTarget ( this . resolution , this . resolution , pars )
180
+ this . luminanceRT = new WebGLRenderTarget ( this . resolution , this . resolution )
198
181
this . luminanceRT . texture . name = 'AdaptiveToneMappingPass.l'
199
182
this . luminanceRT . texture . generateMipmaps = false
200
183
201
- this . previousLuminanceRT = new WebGLRenderTarget ( this . resolution , this . resolution , pars )
184
+ this . previousLuminanceRT = new WebGLRenderTarget ( this . resolution , this . resolution )
202
185
this . previousLuminanceRT . texture . name = 'AdaptiveToneMappingPass.pl'
203
186
this . previousLuminanceRT . texture . generateMipmaps = false
204
187
205
188
// We only need mipmapping for the current luminosity because we want a down-sampled version to sample in our adaptive shader
206
- pars . minFilter = LinearMipmapLinearFilter
207
- pars . generateMipmaps = true
189
+
190
+ const pars = { minFilter : LinearMipmapLinearFilter , generateMipmaps : true }
191
+
208
192
this . currentLuminanceRT = new WebGLRenderTarget ( this . resolution , this . resolution , pars )
209
193
this . currentLuminanceRT . texture . name = 'AdaptiveToneMappingPass.cl'
210
194
@@ -221,9 +205,9 @@ AdaptiveToneMappingPass.prototype = Object.assign(Object.create(Pass.prototype),
221
205
// renderer.render( this.scene, this.camera, this.luminanceRT );
222
206
// renderer.render( this.scene, this.camera, this.previousLuminanceRT );
223
207
// renderer.render( this.scene, this.camera, this.currentLuminanceRT );
224
- } ,
208
+ }
225
209
226
- setAdaptive : function ( adaptive ) {
210
+ setAdaptive ( adaptive ) {
227
211
if ( adaptive ) {
228
212
this . adaptive = true
229
213
this . materialToneMap . defines [ 'ADAPTED_LUMINANCE' ] = ''
@@ -235,40 +219,40 @@ AdaptiveToneMappingPass.prototype = Object.assign(Object.create(Pass.prototype),
235
219
}
236
220
237
221
this . materialToneMap . needsUpdate = true
238
- } ,
222
+ }
239
223
240
- setAdaptionRate : function ( rate ) {
224
+ setAdaptionRate ( rate ) {
241
225
if ( rate ) {
242
226
this . materialAdaptiveLum . uniforms . tau . value = Math . abs ( rate )
243
227
}
244
- } ,
228
+ }
245
229
246
- setMinLuminance : function ( minLum ) {
230
+ setMinLuminance ( minLum ) {
247
231
if ( minLum ) {
248
232
this . materialToneMap . uniforms . minLuminance . value = minLum
249
233
this . materialAdaptiveLum . uniforms . minLuminance . value = minLum
250
234
}
251
- } ,
235
+ }
252
236
253
- setMaxLuminance : function ( maxLum ) {
237
+ setMaxLuminance ( maxLum ) {
254
238
if ( maxLum ) {
255
239
this . materialToneMap . uniforms . maxLuminance . value = maxLum
256
240
}
257
- } ,
241
+ }
258
242
259
- setAverageLuminance : function ( avgLum ) {
243
+ setAverageLuminance ( avgLum ) {
260
244
if ( avgLum ) {
261
245
this . materialToneMap . uniforms . averageLuminance . value = avgLum
262
246
}
263
- } ,
247
+ }
264
248
265
- setMiddleGrey : function ( middleGrey ) {
249
+ setMiddleGrey ( middleGrey ) {
266
250
if ( middleGrey ) {
267
251
this . materialToneMap . uniforms . middleGrey . value = middleGrey
268
252
}
269
- } ,
253
+ }
270
254
271
- dispose : function ( ) {
255
+ dispose ( ) {
272
256
if ( this . luminanceRT ) {
273
257
this . luminanceRT . dispose ( )
274
258
}
@@ -296,7 +280,7 @@ AdaptiveToneMappingPass.prototype = Object.assign(Object.create(Pass.prototype),
296
280
if ( this . materialToneMap ) {
297
281
this . materialToneMap . dispose ( )
298
282
}
299
- } ,
300
- } )
283
+ }
284
+ }
301
285
302
286
export { AdaptiveToneMappingPass }
0 commit comments