Skip to content

Commit 8fdcd27

Browse files
committed
WebGLRenderer: Add internal MSAA render target with centralized tonemapping.
1 parent 3e8ca1e commit 8fdcd27

19 files changed

+195
-53
lines changed

examples/jsm/lines/LineMaterial.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -393,8 +393,6 @@ ShaderLib[ 'line' ] = {
393393
394394
gl_FragColor = vec4( diffuseColor.rgb, alpha );
395395
396-
#include <tonemapping_fragment>
397-
#include <colorspace_fragment>
398396
#include <fog_fragment>
399397
#include <premultiplied_alpha_fragment>
400398

examples/jsm/materials/LDrawConditionalLineMaterial.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,6 @@ class LDrawConditionalLineMaterial extends ShaderMaterial {
116116
#include <color_fragment>
117117
outgoingLight = diffuseColor.rgb; // simple shader
118118
gl_FragColor = vec4( outgoingLight, diffuseColor.a );
119-
#include <tonemapping_fragment>
120-
#include <colorspace_fragment>
121119
#include <fog_fragment>
122120
#include <premultiplied_alpha_fragment>
123121
}

examples/jsm/materials/MeshGouraudMaterial.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,6 @@ const GouraudShader = {
221221
#endif
222222
223223
#include <common>
224-
#include <dithering_pars_fragment>
225224
#include <color_pars_fragment>
226225
#include <uv_pars_fragment>
227226
#include <map_pars_fragment>
@@ -300,11 +299,8 @@ const GouraudShader = {
300299
#include <envmap_fragment>
301300
302301
#include <opaque_fragment>
303-
#include <tonemapping_fragment>
304-
#include <colorspace_fragment>
305302
#include <fog_fragment>
306303
#include <premultiplied_alpha_fragment>
307-
#include <dithering_fragment>
308304
309305
}`
310306

src/renderers/WebGLRenderer.js

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ import {
44
FrontSide,
55
DoubleSide,
66
HalfFloatType,
7-
UnsignedByteType,
87
NoToneMapping,
98
LinearMipmapLinearFilter,
109
SRGBColorSpace,
1110
LinearSRGBColorSpace,
1211
RGBAIntegerFormat,
1312
RGIntegerFormat,
1413
RedIntegerFormat,
14+
UnsignedByteType,
1515
UnsignedIntType,
1616
UnsignedShortType,
1717
UnsignedInt248Type,
@@ -31,6 +31,7 @@ import { WebGLBindingStates } from './webgl/WebGLBindingStates.js';
3131
import { WebGLBufferRenderer } from './webgl/WebGLBufferRenderer.js';
3232
import { WebGLCapabilities } from './webgl/WebGLCapabilities.js';
3333
import { WebGLClipping } from './webgl/WebGLClipping.js';
34+
import { WebGLComposite } from './webgl/WebGLComposite.js';
3435
import { WebGLCubeMaps } from './webgl/WebGLCubeMaps.js';
3536
import { WebGLCubeUVMaps } from './webgl/WebGLCubeUVMaps.js';
3637
import { WebGLExtensions } from './webgl/WebGLExtensions.js';
@@ -339,6 +340,10 @@ class WebGLRenderer {
339340

340341
let _renderBackground = false;
341342

343+
// internal composite pass for tonemapping, color space conversion, and dithering
344+
let _composite = null;
345+
let _isRenderingComposite = false;
346+
342347
function getTargetPixelRatio() {
343348

344349
return _currentRenderTarget === null ? _pixelRatio : 1;
@@ -454,6 +459,10 @@ class WebGLRenderer {
454459

455460
info.programs = programCache.programs;
456461

462+
// Initialize composite pass for tonemapping, color space conversion, and dithering
463+
_composite = new WebGLComposite( extensions, capabilities );
464+
_composite.setSize( _width * _pixelRatio, _height * _pixelRatio );
465+
457466
/**
458467
* Holds details about the capabilities of the current rendering context.
459468
*
@@ -655,6 +664,9 @@ class WebGLRenderer {
655664

656665
}
657666

667+
// Resize composite render target
668+
_composite.setSize( width * _pixelRatio, height * _pixelRatio );
669+
658670
this.setViewport( 0, 0, width, height );
659671

660672
};
@@ -694,6 +706,9 @@ class WebGLRenderer {
694706
canvas.width = Math.floor( width * pixelRatio );
695707
canvas.height = Math.floor( height * pixelRatio );
696708

709+
// Resize composite render target
710+
_composite.setSize( width * pixelRatio, height * pixelRatio );
711+
697712
this.setViewport( 0, 0, width, height );
698713

699714
};
@@ -1007,6 +1022,9 @@ class WebGLRenderer {
10071022
uniformsGroups.dispose();
10081023
programCache.dispose();
10091024

1025+
// Dispose composite pass
1026+
_composite.dispose();
1027+
10101028
xr.dispose();
10111029

10121030
xr.removeEventListener( 'sessionstart', onXRSessionStart );
@@ -1563,6 +1581,36 @@ class WebGLRenderer {
15631581

15641582
}
15651583

1584+
// Determine if we should use composite pass for tonemapping, color space conversion, and dithering
1585+
const useComposite = scene.isScene === true && _currentRenderTarget === null && _isRenderingComposite === false;
1586+
const useXR = xr.enabled === true && xr.isPresenting === true;
1587+
const userToneMapping = _this.toneMapping;
1588+
1589+
let compositeRenderTarget = null;
1590+
1591+
if ( useComposite ) {
1592+
1593+
// Choose render target based on XR mode
1594+
if ( useXR ) {
1595+
1596+
compositeRenderTarget = _composite.xrRenderTarget;
1597+
1598+
// Resize XR render target to match the XR framebuffer
1599+
const size = _this.getDrawingBufferSize( _vector2 );
1600+
_composite.setXRSize( size.x, size.y );
1601+
1602+
} else {
1603+
1604+
compositeRenderTarget = _composite.renderTarget;
1605+
1606+
}
1607+
1608+
// Render to internal MSAA target, disable tone mapping (will be applied in composite pass)
1609+
_this.setRenderTarget( compositeRenderTarget );
1610+
_this.toneMapping = NoToneMapping;
1611+
1612+
}
1613+
15661614
//
15671615
if ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget );
15681616

@@ -1684,6 +1732,19 @@ class WebGLRenderer {
16841732

16851733
}
16861734

1735+
// Perform composite pass for tonemapping, color space conversion, and dithering
1736+
if ( useComposite ) {
1737+
1738+
// Restore tone mapping for composite pass
1739+
_this.toneMapping = userToneMapping;
1740+
1741+
// Render composite pass to canvas
1742+
_isRenderingComposite = true;
1743+
_composite.render( _this, compositeRenderTarget );
1744+
_isRenderingComposite = false;
1745+
1746+
}
1747+
16871748
//
16881749

16891750
if ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );

src/renderers/shaders/ShaderLib/background.glsl.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,5 @@ void main() {
3333
3434
gl_FragColor = texColor;
3535
36-
#include <tonemapping_fragment>
37-
#include <colorspace_fragment>
38-
3936
}
4037
`;

src/renderers/shaders/ShaderLib/backgroundCube.glsl.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,5 @@ void main() {
5656
5757
gl_FragColor = texColor;
5858
59-
#include <tonemapping_fragment>
60-
#include <colorspace_fragment>
61-
6259
}
6360
`;

src/renderers/shaders/ShaderLib/cube.glsl.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,5 @@ void main() {
2929
gl_FragColor = texColor;
3030
gl_FragColor.a *= opacity;
3131
32-
#include <tonemapping_fragment>
33-
#include <colorspace_fragment>
34-
3532
}
3633
`;

src/renderers/shaders/ShaderLib/equirect.glsl.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,5 @@ void main() {
2828
2929
gl_FragColor = texture2D( tEquirect, sampleUV );
3030
31-
#include <tonemapping_fragment>
32-
#include <colorspace_fragment>
33-
3431
}
3532
`;

src/renderers/shaders/ShaderLib/linedashed.glsl.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,6 @@ void main() {
6767
outgoingLight = diffuseColor.rgb; // simple shader
6868
6969
#include <opaque_fragment>
70-
#include <tonemapping_fragment>
71-
#include <colorspace_fragment>
7270
#include <fog_fragment>
7371
#include <premultiplied_alpha_fragment>
7472

src/renderers/shaders/ShaderLib/meshbasic.glsl.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ uniform float opacity;
5353
#endif
5454
5555
#include <common>
56-
#include <dithering_pars_fragment>
5756
#include <color_pars_fragment>
5857
#include <uv_pars_fragment>
5958
#include <map_pars_fragment>
@@ -106,11 +105,8 @@ void main() {
106105
#include <envmap_fragment>
107106
108107
#include <opaque_fragment>
109-
#include <tonemapping_fragment>
110-
#include <colorspace_fragment>
111108
#include <fog_fragment>
112109
#include <premultiplied_alpha_fragment>
113-
#include <dithering_fragment>
114110
115111
}
116112
`;

0 commit comments

Comments
 (0)