three-gpu-pathtracer 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,233 +1,237 @@
1
- import { RGBAFormat, FloatType, Color, Vector2, WebGLRenderTarget, NoBlending, NormalBlending } from 'three';
2
- import { FullScreenQuad } from 'three/examples/jsm/postprocessing/Pass.js';
3
- import { BlendMaterial } from '../materials/BlendMaterial.js';
4
-
5
- function* renderTask() {
6
-
7
- const {
8
- _renderer,
9
- _fsQuad,
10
- _blendQuad,
11
- _primaryTarget,
12
- _blendTargets,
13
- alpha,
14
- camera,
15
- material,
16
- } = this;
17
-
18
- const blendMaterial = _blendQuad.material;
19
- let [ blendTarget1, blendTarget2 ] = _blendTargets;
20
-
21
- while ( true ) {
22
-
23
- if ( alpha ) {
24
-
25
- blendMaterial.opacity = 1 / ( this.samples + 1 );
26
- material.blending = NoBlending;
27
-
28
- } else {
29
-
30
- material.opacity = 1 / ( this.samples + 1 );
31
- material.blending = NormalBlending;
32
-
33
- }
34
-
35
- const w = _primaryTarget.width;
36
- const h = _primaryTarget.height;
37
- material.resolution.set( w, h );
38
- material.seed ++;
39
-
40
- const tx = this.tiles.x || 1;
41
- const ty = this.tiles.y || 1;
42
- const totalTiles = tx * ty;
43
- const dprInv = ( 1 / _renderer.getPixelRatio() );
44
- for ( let y = 0; y < ty; y ++ ) {
45
-
46
- for ( let x = 0; x < tx; x ++ ) {
47
-
48
- material.cameraWorldMatrix.copy( camera.matrixWorld );
49
- material.invProjectionMatrix.copy( camera.projectionMatrixInverse );
50
-
51
- const ogRenderTarget = _renderer.getRenderTarget();
52
- const ogAutoClear = _renderer.autoClear;
53
-
54
- // three.js renderer takes values relative to the current pixel ratio
55
- _renderer.setRenderTarget( _primaryTarget );
56
- _renderer.setScissorTest( true );
57
- _renderer.setScissor(
58
- dprInv * Math.ceil( x * w / tx ),
59
- dprInv * Math.ceil( ( ty - y - 1 ) * h / ty ),
60
- dprInv * Math.ceil( w / tx ),
61
- dprInv * Math.ceil( h / ty ) );
62
- _renderer.autoClear = false;
63
- _fsQuad.render( _renderer );
64
-
65
- _renderer.setScissorTest( false );
66
- _renderer.setRenderTarget( ogRenderTarget );
67
- _renderer.autoClear = ogAutoClear;
68
-
69
- if ( alpha ) {
70
-
71
- blendMaterial.target1 = blendTarget1.texture;
72
- blendMaterial.target2 = _primaryTarget.texture;
73
-
74
- _renderer.setRenderTarget( blendTarget2 );
75
- _blendQuad.render( _renderer );
76
- _renderer.setRenderTarget( ogRenderTarget );
77
-
78
- }
79
-
80
- this.samples += ( 1 / totalTiles );
81
-
82
- yield;
83
-
84
- }
85
-
86
- }
87
-
88
- [ blendTarget1, blendTarget2 ] = [ blendTarget2, blendTarget1 ];
89
-
90
- this.samples = Math.round( this.samples );
91
-
92
- }
93
-
94
- }
95
-
96
- const ogClearColor = new Color();
97
- export class PathTracingRenderer {
98
-
99
- get material() {
100
-
101
- return this._fsQuad.material;
102
-
103
- }
104
-
105
- set material( v ) {
106
-
107
- this._fsQuad.material = v;
108
-
109
- }
110
-
111
- get target() {
112
-
113
- return this._alpha ? this._blendTargets[ 1 ] : this._primaryTarget;
114
-
115
- }
116
-
117
- set alpha( v ) {
118
-
119
- if ( ! v ) {
120
-
121
- this._blendTargets[ 0 ].dispose();
122
- this._blendTargets[ 1 ].dispose();
123
-
124
- }
125
-
126
- this._alpha = v;
127
- this.reset();
128
-
129
- }
130
-
131
- get alpha() {
132
-
133
- return this._alpha;
134
-
135
- }
136
-
137
- constructor( renderer ) {
138
-
139
- this.camera = null;
140
- this.tiles = new Vector2( 1, 1 );
141
-
142
- this.samples = 0;
143
- this.stableNoise = false;
144
- this._renderer = renderer;
145
- this._alpha = false;
146
- this._fsQuad = new FullScreenQuad( null );
147
- this._blendQuad = new FullScreenQuad( new BlendMaterial() );
148
- this._task = null;
149
-
150
- this._primaryTarget = new WebGLRenderTarget( 1, 1, {
151
- format: RGBAFormat,
152
- type: FloatType,
153
- } );
154
- this._blendTargets = [
155
- new WebGLRenderTarget( 1, 1, {
156
- format: RGBAFormat,
157
- type: FloatType,
158
- } ),
159
- new WebGLRenderTarget( 1, 1, {
160
- format: RGBAFormat,
161
- type: FloatType,
162
- } ),
163
- ];
164
-
165
- }
166
-
167
- setSize( w, h ) {
168
-
169
- this._primaryTarget.setSize( w, h );
170
- this._blendTargets[ 0 ].setSize( w, h );
171
- this._blendTargets[ 1 ].setSize( w, h );
172
- this.reset();
173
-
174
- }
175
-
176
- dispose() {
177
-
178
- this._primaryTarget.dispose();
179
- this._blendTargets[ 0 ].dispose();
180
- this._blendTargets[ 1 ].dispose();
181
-
182
- this._fsQuad.dispose();
183
- this._blendQuad.dispose();
184
- this._task = null;
185
-
186
- }
187
-
188
- reset() {
189
-
190
- const { _renderer, _primaryTarget, _blendTargets } = this;
191
- const ogRenderTarget = _renderer.getRenderTarget();
192
- const ogClearAlpha = _renderer.getClearAlpha();
193
- _renderer.getClearColor( ogClearColor );
194
-
195
- _renderer.setRenderTarget( _primaryTarget );
196
- _renderer.setClearColor( 0, 0 );
197
- _renderer.clearColor();
198
-
199
- _renderer.setRenderTarget( _blendTargets[ 0 ] );
200
- _renderer.setClearColor( 0, 0 );
201
- _renderer.clearColor();
202
-
203
- _renderer.setRenderTarget( _blendTargets[ 1 ] );
204
- _renderer.setClearColor( 0, 0 );
205
- _renderer.clearColor();
206
-
207
- _renderer.setClearColor( ogClearColor, ogClearAlpha );
208
- _renderer.setRenderTarget( ogRenderTarget );
209
-
210
- this.samples = 0;
211
- this._task = null;
212
-
213
- if ( this.stableNoise ) {
214
-
215
- this.material.seed = 0;
216
-
217
- }
218
-
219
- }
220
-
221
- update() {
222
-
223
- if ( ! this._task ) {
224
-
225
- this._task = renderTask.call( this );
226
-
227
- }
228
-
229
- this._task.next();
230
-
231
- }
232
-
233
- }
1
+ import { RGBAFormat, FloatType, Color, Vector2, WebGLRenderTarget, NoBlending, NormalBlending } from 'three';
2
+ import { FullScreenQuad } from 'three/examples/jsm/postprocessing/Pass.js';
3
+ import { BlendMaterial } from '../materials/BlendMaterial.js';
4
+
5
+ function* renderTask() {
6
+
7
+ const {
8
+ _renderer,
9
+ _fsQuad,
10
+ _blendQuad,
11
+ _primaryTarget,
12
+ _blendTargets,
13
+ alpha,
14
+ camera,
15
+ material,
16
+ } = this;
17
+
18
+ const blendMaterial = _blendQuad.material;
19
+ let [ blendTarget1, blendTarget2 ] = _blendTargets;
20
+
21
+ while ( true ) {
22
+
23
+ if ( alpha ) {
24
+
25
+ blendMaterial.opacity = 1 / ( this.samples + 1 );
26
+ material.blending = NoBlending;
27
+ material.opacity = 1;
28
+
29
+ } else {
30
+
31
+ material.opacity = 1 / ( this.samples + 1 );
32
+ material.blending = NormalBlending;
33
+
34
+ }
35
+
36
+ const w = _primaryTarget.width;
37
+ const h = _primaryTarget.height;
38
+ material.resolution.set( w, h );
39
+ material.seed ++;
40
+
41
+ const tx = this.tiles.x || 1;
42
+ const ty = this.tiles.y || 1;
43
+ const totalTiles = tx * ty;
44
+ const dprInv = ( 1 / _renderer.getPixelRatio() );
45
+ for ( let y = 0; y < ty; y ++ ) {
46
+
47
+ for ( let x = 0; x < tx; x ++ ) {
48
+
49
+ material.cameraWorldMatrix.copy( camera.matrixWorld );
50
+ material.invProjectionMatrix.copy( camera.projectionMatrixInverse );
51
+ // An orthographic projection matrix will always have the bottom right element == 1
52
+ // And a perspective projection matrix will always have the bottom right element == 0
53
+ material.isOrthographicCamera = camera.projectionMatrix.elements[ 15 ] > 0;
54
+
55
+ const ogRenderTarget = _renderer.getRenderTarget();
56
+ const ogAutoClear = _renderer.autoClear;
57
+
58
+ // three.js renderer takes values relative to the current pixel ratio
59
+ _renderer.setRenderTarget( _primaryTarget );
60
+ _renderer.setScissorTest( true );
61
+ _renderer.setScissor(
62
+ dprInv * Math.ceil( x * w / tx ),
63
+ dprInv * Math.ceil( ( ty - y - 1 ) * h / ty ),
64
+ dprInv * Math.ceil( w / tx ),
65
+ dprInv * Math.ceil( h / ty ) );
66
+ _renderer.autoClear = false;
67
+ _fsQuad.render( _renderer );
68
+
69
+ _renderer.setScissorTest( false );
70
+ _renderer.setRenderTarget( ogRenderTarget );
71
+ _renderer.autoClear = ogAutoClear;
72
+
73
+ if ( alpha ) {
74
+
75
+ blendMaterial.target1 = blendTarget1.texture;
76
+ blendMaterial.target2 = _primaryTarget.texture;
77
+
78
+ _renderer.setRenderTarget( blendTarget2 );
79
+ _blendQuad.render( _renderer );
80
+ _renderer.setRenderTarget( ogRenderTarget );
81
+
82
+ }
83
+
84
+ this.samples += ( 1 / totalTiles );
85
+
86
+ yield;
87
+
88
+ }
89
+
90
+ }
91
+
92
+ [ blendTarget1, blendTarget2 ] = [ blendTarget2, blendTarget1 ];
93
+
94
+ this.samples = Math.round( this.samples );
95
+
96
+ }
97
+
98
+ }
99
+
100
+ const ogClearColor = new Color();
101
+ export class PathTracingRenderer {
102
+
103
+ get material() {
104
+
105
+ return this._fsQuad.material;
106
+
107
+ }
108
+
109
+ set material( v ) {
110
+
111
+ this._fsQuad.material = v;
112
+
113
+ }
114
+
115
+ get target() {
116
+
117
+ return this._alpha ? this._blendTargets[ 1 ] : this._primaryTarget;
118
+
119
+ }
120
+
121
+ set alpha( v ) {
122
+
123
+ if ( ! v ) {
124
+
125
+ this._blendTargets[ 0 ].dispose();
126
+ this._blendTargets[ 1 ].dispose();
127
+
128
+ }
129
+
130
+ this._alpha = v;
131
+ this.reset();
132
+
133
+ }
134
+
135
+ get alpha() {
136
+
137
+ return this._alpha;
138
+
139
+ }
140
+
141
+ constructor( renderer ) {
142
+
143
+ this.camera = null;
144
+ this.tiles = new Vector2( 1, 1 );
145
+
146
+ this.samples = 0;
147
+ this.stableNoise = false;
148
+ this._renderer = renderer;
149
+ this._alpha = false;
150
+ this._fsQuad = new FullScreenQuad( null );
151
+ this._blendQuad = new FullScreenQuad( new BlendMaterial() );
152
+ this._task = null;
153
+
154
+ this._primaryTarget = new WebGLRenderTarget( 1, 1, {
155
+ format: RGBAFormat,
156
+ type: FloatType,
157
+ } );
158
+ this._blendTargets = [
159
+ new WebGLRenderTarget( 1, 1, {
160
+ format: RGBAFormat,
161
+ type: FloatType,
162
+ } ),
163
+ new WebGLRenderTarget( 1, 1, {
164
+ format: RGBAFormat,
165
+ type: FloatType,
166
+ } ),
167
+ ];
168
+
169
+ }
170
+
171
+ setSize( w, h ) {
172
+
173
+ this._primaryTarget.setSize( w, h );
174
+ this._blendTargets[ 0 ].setSize( w, h );
175
+ this._blendTargets[ 1 ].setSize( w, h );
176
+ this.reset();
177
+
178
+ }
179
+
180
+ dispose() {
181
+
182
+ this._primaryTarget.dispose();
183
+ this._blendTargets[ 0 ].dispose();
184
+ this._blendTargets[ 1 ].dispose();
185
+
186
+ this._fsQuad.dispose();
187
+ this._blendQuad.dispose();
188
+ this._task = null;
189
+
190
+ }
191
+
192
+ reset() {
193
+
194
+ const { _renderer, _primaryTarget, _blendTargets } = this;
195
+ const ogRenderTarget = _renderer.getRenderTarget();
196
+ const ogClearAlpha = _renderer.getClearAlpha();
197
+ _renderer.getClearColor( ogClearColor );
198
+
199
+ _renderer.setRenderTarget( _primaryTarget );
200
+ _renderer.setClearColor( 0, 0 );
201
+ _renderer.clearColor();
202
+
203
+ _renderer.setRenderTarget( _blendTargets[ 0 ] );
204
+ _renderer.setClearColor( 0, 0 );
205
+ _renderer.clearColor();
206
+
207
+ _renderer.setRenderTarget( _blendTargets[ 1 ] );
208
+ _renderer.setClearColor( 0, 0 );
209
+ _renderer.clearColor();
210
+
211
+ _renderer.setClearColor( ogClearColor, ogClearAlpha );
212
+ _renderer.setRenderTarget( ogRenderTarget );
213
+
214
+ this.samples = 0;
215
+ this._task = null;
216
+
217
+ if ( this.stableNoise ) {
218
+
219
+ this.material.seed = 0;
220
+
221
+ }
222
+
223
+ }
224
+
225
+ update() {
226
+
227
+ if ( ! this._task ) {
228
+
229
+ this._task = renderTask.call( this );
230
+
231
+ }
232
+
233
+ this._task.next();
234
+
235
+ }
236
+
237
+ }
@@ -1,52 +1,52 @@
1
- import { Mesh } from 'three';
2
- import { SAH, MeshBVH, StaticGeometryGenerator } from 'three-mesh-bvh';
3
- import { mergeMeshes } from '../utils/GeometryPreparationUtils.js';
4
-
5
- export class PathTracingSceneGenerator {
6
-
7
- prepScene( scene ) {
8
-
9
- const meshes = [];
10
- scene.traverse( c => {
11
-
12
- if ( c.isSkinnedMesh || c.isMesh && c.morphTargetInfluences ) {
13
-
14
- const generator = new StaticGeometryGenerator( c );
15
- generator.applyWorldTransforms = false;
16
- const mesh = new Mesh(
17
- generator.generate(),
18
- c.material,
19
- );
20
- mesh.matrixWorld.copy( c.matrixWorld );
21
- mesh.matrix.copy( c.matrixWorld );
22
- mesh.matrix.decompose( mesh.position, mesh.quaternion, mesh.scale );
23
- meshes.push( mesh );
24
-
25
- } else if ( c.isMesh ) {
26
-
27
- meshes.push( c );
28
-
29
- }
30
-
31
- } );
32
-
33
- return mergeMeshes( meshes, {
34
- attributes: [ 'position', 'normal', 'tangent', 'uv' ],
35
- } );
36
-
37
- }
38
-
39
- generate( scene, options = {} ) {
40
-
41
- const { materials, textures, geometry } = this.prepScene( scene );
42
- const bvhOptions = { strategy: SAH, ...options, maxLeafTris: 1 };
43
- return {
44
- scene,
45
- materials,
46
- textures,
47
- bvh: new MeshBVH( geometry, bvhOptions ),
48
- };
49
-
50
- }
51
-
52
- }
1
+ import { Mesh } from 'three';
2
+ import { SAH, MeshBVH, StaticGeometryGenerator } from 'three-mesh-bvh';
3
+ import { mergeMeshes } from '../utils/GeometryPreparationUtils.js';
4
+
5
+ export class PathTracingSceneGenerator {
6
+
7
+ prepScene( scene ) {
8
+
9
+ const meshes = [];
10
+ scene.traverse( c => {
11
+
12
+ if ( c.isSkinnedMesh || c.isMesh && c.morphTargetInfluences ) {
13
+
14
+ const generator = new StaticGeometryGenerator( c );
15
+ generator.applyWorldTransforms = false;
16
+ const mesh = new Mesh(
17
+ generator.generate(),
18
+ c.material,
19
+ );
20
+ mesh.matrixWorld.copy( c.matrixWorld );
21
+ mesh.matrix.copy( c.matrixWorld );
22
+ mesh.matrix.decompose( mesh.position, mesh.quaternion, mesh.scale );
23
+ meshes.push( mesh );
24
+
25
+ } else if ( c.isMesh ) {
26
+
27
+ meshes.push( c );
28
+
29
+ }
30
+
31
+ } );
32
+
33
+ return mergeMeshes( meshes, {
34
+ attributes: [ 'position', 'normal', 'tangent', 'uv' ],
35
+ } );
36
+
37
+ }
38
+
39
+ generate( scene, options = {} ) {
40
+
41
+ const { materials, textures, geometry } = this.prepScene( scene );
42
+ const bvhOptions = { strategy: SAH, ...options, maxLeafTris: 1 };
43
+ return {
44
+ scene,
45
+ materials,
46
+ textures,
47
+ bvh: new MeshBVH( geometry, bvhOptions ),
48
+ };
49
+
50
+ }
51
+
52
+ }
@@ -1,28 +1,28 @@
1
- import { PerspectiveCamera } from 'three';
2
-
3
- export class PhysicalCamera extends PerspectiveCamera {
4
-
5
- set bokehSize( size ) {
6
-
7
- this.fStop = this.getFocalLength() / size;
8
-
9
- }
10
-
11
- get bokehSize() {
12
-
13
- return this.getFocalLength() / this.fStop;
14
-
15
- }
16
-
17
- constructor( ...args ) {
18
-
19
- super( ...args );
20
- this.fStop = 1.4;
21
- this.apertureBlades = 0;
22
- this.apertureRotation = 0;
23
- this.focusDistance = 25;
24
- this.anamorphicRatio = 1;
25
-
26
- }
27
-
28
- }
1
+ import { PerspectiveCamera } from 'three';
2
+
3
+ export class PhysicalCamera extends PerspectiveCamera {
4
+
5
+ set bokehSize( size ) {
6
+
7
+ this.fStop = this.getFocalLength() / size;
8
+
9
+ }
10
+
11
+ get bokehSize() {
12
+
13
+ return this.getFocalLength() / this.fStop;
14
+
15
+ }
16
+
17
+ constructor( ...args ) {
18
+
19
+ super( ...args );
20
+ this.fStop = 1.4;
21
+ this.apertureBlades = 0;
22
+ this.apertureRotation = 0;
23
+ this.focusDistance = 25;
24
+ this.anamorphicRatio = 1;
25
+
26
+ }
27
+
28
+ }