@@ -12,154 +12,136 @@ import {
12
12
WebGLRenderTarget ,
13
13
} from 'three'
14
14
15
- const AnaglyphEffect = function ( renderer , width , height ) {
16
- // Dubois matrices from https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.7.6968&rep=rep1&type=pdf#page=4
17
-
18
- this . colorMatrixLeft = new Matrix3 ( ) . fromArray ( [
19
- 0.4561 ,
20
- - 0.0400822 ,
21
- - 0.0152161 ,
22
- 0.500484 ,
23
- - 0.0378246 ,
24
- - 0.0205971 ,
25
- 0.176381 ,
26
- - 0.0157589 ,
27
- - 0.00546856 ,
28
- ] )
29
-
30
- this . colorMatrixRight = new Matrix3 ( ) . fromArray ( [
31
- - 0.0434706 ,
32
- 0.378476 ,
33
- - 0.0721527 ,
34
- - 0.0879388 ,
35
- 0.73364 ,
36
- - 0.112961 ,
37
- - 0.00155529 ,
38
- - 0.0184503 ,
39
- 1.2264 ,
40
- ] )
41
-
42
- const _camera = new OrthographicCamera ( - 1 , 1 , 1 , - 1 , 0 , 1 )
43
-
44
- const _scene = new Scene ( )
45
-
46
- const _stereo = new StereoCamera ( )
47
-
48
- const _params = {
49
- minFilter : LinearFilter ,
50
- magFilter : NearestFilter ,
51
- format : RGBAFormat ,
52
- }
15
+ class AnaglyphEffect {
16
+ constructor ( renderer , width = 512 , height = 512 ) {
17
+ // Dubois matrices from https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.7.6968&rep=rep1&type=pdf#page=4
53
18
54
- if ( width === undefined ) width = 512
55
- if ( height === undefined ) height = 512
19
+ this . colorMatrixLeft = new Matrix3 ( ) . fromArray ( [
20
+ 0.4561 ,
21
+ - 0.0400822 ,
22
+ - 0.0152161 ,
23
+ 0.500484 ,
24
+ - 0.0378246 ,
25
+ - 0.0205971 ,
26
+ 0.176381 ,
27
+ - 0.0157589 ,
28
+ - 0.00546856 ,
29
+ ] )
56
30
57
- const _renderTargetL = new WebGLRenderTarget ( width , height , _params )
58
- const _renderTargetR = new WebGLRenderTarget ( width , height , _params )
31
+ this . colorMatrixRight = new Matrix3 ( ) . fromArray ( [
32
+ - 0.0434706 ,
33
+ 0.378476 ,
34
+ - 0.0721527 ,
35
+ - 0.0879388 ,
36
+ 0.73364 ,
37
+ - 0.112961 ,
38
+ - 0.00155529 ,
39
+ - 0.0184503 ,
40
+ 1.2264 ,
41
+ ] )
59
42
60
- const _material = new ShaderMaterial ( {
61
- uniforms : {
62
- mapLeft : { value : _renderTargetL . texture } ,
63
- mapRight : { value : _renderTargetR . texture } ,
43
+ const _camera = new OrthographicCamera ( - 1 , 1 , 1 , - 1 , 0 , 1 )
64
44
65
- colorMatrixLeft : { value : this . colorMatrixLeft } ,
66
- colorMatrixRight : { value : this . colorMatrixRight } ,
67
- } ,
45
+ const _scene = new Scene ( )
68
46
69
- vertexShader : [
70
- 'varying vec2 vUv;' ,
47
+ const _stereo = new StereoCamera ( )
71
48
72
- 'void main() {' ,
49
+ const _params = { minFilter : LinearFilter , magFilter : NearestFilter , format : RGBAFormat }
73
50
74
- ' vUv = vec2( uv.x, uv.y );' ,
75
- ' gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );' ,
51
+ const _renderTargetL = new WebGLRenderTarget ( width , height , _params )
52
+ const _renderTargetR = new WebGLRenderTarget ( width , height , _params )
76
53
77
- '}' ,
78
- ] . join ( '\n' ) ,
54
+ const _material = new ShaderMaterial ( {
55
+ uniforms : {
56
+ mapLeft : { value : _renderTargetL . texture } ,
57
+ mapRight : { value : _renderTargetR . texture } ,
79
58
80
- fragmentShader : [
81
- 'uniform sampler2D mapLeft;' ,
82
- 'uniform sampler2D mapRight;' ,
83
- 'varying vec2 vUv;' ,
59
+ colorMatrixLeft : { value : this . colorMatrixLeft } ,
60
+ colorMatrixRight : { value : this . colorMatrixRight } ,
61
+ } ,
84
62
85
- 'uniform mat3 colorMatrixLeft;' ,
86
- 'uniform mat3 colorMatrixRight ;',
63
+ vertexShader : [
64
+ 'varying vec2 vUv ;',
87
65
88
- // These functions implement sRGB linearization and gamma correction
66
+ 'void main() {' ,
89
67
90
- 'float lin( float c ) {' ,
91
- ' return c <= 0.04045 ? c * 0.0773993808 :' ,
92
- ' pow( c * 0.9478672986 + 0.0521327014, 2.4 );' ,
93
- '}' ,
68
+ ' vUv = vec2( uv.x, uv.y );' ,
69
+ ' gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );' ,
94
70
95
- 'vec4 lin( vec4 c ) {' ,
96
- ' return vec4( lin( c.r ), lin( c.g ), lin( c.b ), c.a );' ,
97
- '}' ,
71
+ '}' ,
72
+ ] . join ( '\n' ) ,
98
73
99
- 'float dev( float c ) {' ,
100
- ' return c <= 0.0031308 ? c * 12.92 ',
101
- ' : pow( c, 0.41666 ) * 1.055 - 0.055 ;',
102
- '} ',
74
+ fragmentShader : [
75
+ 'uniform sampler2D mapLeft; ',
76
+ 'uniform sampler2D mapRight ;',
77
+ 'varying vec2 vUv; ',
103
78
104
- 'void main() {' ,
79
+ 'uniform mat3 colorMatrixLeft;' ,
80
+ 'uniform mat3 colorMatrixRight;' ,
105
81
106
- ' vec2 uv = vUv; ',
82
+ 'void main() { ',
107
83
108
- ' vec4 colorL = lin( texture2D( mapLeft, uv ) );' ,
109
- ' vec4 colorR = lin( texture2D( mapRight, uv ) );' ,
84
+ ' vec2 uv = vUv;' ,
110
85
111
- ' vec3 color = clamp(' ,
112
- ' colorMatrixLeft * colorL.rgb +' ,
113
- ' colorMatrixRight * colorR.rgb, 0., 1. );' ,
86
+ ' vec4 colorL = texture2D( mapLeft, uv );' ,
87
+ ' vec4 colorR = texture2D( mapRight, uv );' ,
114
88
115
- ' gl_FragColor = vec4 (',
116
- ' dev( color.r ), dev( color.g ), dev( color.b ), ' ,
117
- ' max( colorL.a, colorR.a ) );' ,
89
+ ' vec3 color = clamp (',
90
+ ' colorMatrixLeft * colorL.rgb + ' ,
91
+ ' colorMatrixRight * colorR.rgb, 0., 1. );' ,
118
92
119
- '} ',
120
- ] . join ( '\n' ) ,
121
- } )
93
+ ' gl_FragColor = vec4( ',
94
+ ' color.r, color.g, color.b,' ,
95
+ ' max( colorL.a, colorR.a ) );' ,
122
96
123
- const _mesh = new Mesh ( new PlaneGeometry ( 2 , 2 ) , _material )
124
- _scene . add ( _mesh )
97
+ ' #include <tonemapping_fragment>' ,
98
+ ' #include <encodings_fragment>' ,
125
99
126
- this . setSize = ( width , height ) => {
127
- renderer . setSize ( width , height )
100
+ '}' ,
101
+ ] . join ( '\n' ) ,
102
+ } )
128
103
129
- const pixelRatio = renderer . getPixelRatio ( )
104
+ const _mesh = new Mesh ( new PlaneGeometry ( 2 , 2 ) , _material )
105
+ _scene . add ( _mesh )
130
106
131
- _renderTargetL . setSize ( width * pixelRatio , height * pixelRatio )
132
- _renderTargetR . setSize ( width * pixelRatio , height * pixelRatio )
133
- }
107
+ this . setSize = function ( width , height ) {
108
+ renderer . setSize ( width , height )
134
109
135
- this . render = ( scene , camera ) => {
136
- const currentRenderTarget = renderer . getRenderTarget ( )
110
+ const pixelRatio = renderer . getPixelRatio ( )
137
111
138
- scene . updateMatrixWorld ( )
112
+ _renderTargetL . setSize ( width * pixelRatio , height * pixelRatio )
113
+ _renderTargetR . setSize ( width * pixelRatio , height * pixelRatio )
114
+ }
139
115
140
- if ( camera . parent === null ) camera . updateMatrixWorld ( )
116
+ this . render = function ( scene , camera ) {
117
+ const currentRenderTarget = renderer . getRenderTarget ( )
141
118
142
- _stereo . update ( camera )
119
+ if ( scene . matrixWorldAutoUpdate === true ) scene . updateMatrixWorld ( )
143
120
144
- renderer . setRenderTarget ( _renderTargetL )
145
- renderer . clear ( )
146
- renderer . render ( scene , _stereo . cameraL )
121
+ if ( camera . parent === null && camera . matrixWorldAutoUpdate === true ) camera . updateMatrixWorld ( )
147
122
148
- renderer . setRenderTarget ( _renderTargetR )
149
- renderer . clear ( )
150
- renderer . render ( scene , _stereo . cameraR )
123
+ _stereo . update ( camera )
151
124
152
- renderer . setRenderTarget ( null )
153
- renderer . render ( _scene , _camera )
125
+ renderer . setRenderTarget ( _renderTargetL )
126
+ renderer . clear ( )
127
+ renderer . render ( scene , _stereo . cameraL )
154
128
155
- renderer . setRenderTarget ( currentRenderTarget )
156
- }
129
+ renderer . setRenderTarget ( _renderTargetR )
130
+ renderer . clear ( )
131
+ renderer . render ( scene , _stereo . cameraR )
132
+
133
+ renderer . setRenderTarget ( null )
134
+ renderer . render ( _scene , _camera )
135
+
136
+ renderer . setRenderTarget ( currentRenderTarget )
137
+ }
157
138
158
- this . dispose = ( ) => {
159
- if ( _renderTargetL ) _renderTargetL . dispose ( )
160
- if ( _renderTargetR ) _renderTargetR . dispose ( )
161
- if ( _mesh ) _mesh . geometry . dispose ( )
162
- if ( _material ) _material . dispose ( )
139
+ this . dispose = function ( ) {
140
+ _renderTargetL . dispose ( )
141
+ _renderTargetR . dispose ( )
142
+ _mesh . geometry . dispose ( )
143
+ _mesh . material . dispose ( )
144
+ }
163
145
}
164
146
}
165
147
0 commit comments