Skip to content

Commit 78c65b0

Browse files
committed
WebGLBackground: Added tonemapping support to color background.
1 parent 313a7ab commit 78c65b0

File tree

2 files changed

+57
-7
lines changed

2 files changed

+57
-7
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
export const vertex = /* glsl */`
2+
void main() {
3+
4+
gl_Position = vec4( position.xy, 1.0, 1.0 );
5+
6+
}
7+
`;
8+
9+
export const fragment = /* glsl */`
10+
uniform vec3 color;
11+
12+
void main() {
13+
14+
gl_FragColor = vec4( color, 1.0 );
15+
16+
#include <tonemapping_fragment>
17+
#include <colorspace_fragment>
18+
19+
}
20+
`;

src/renderers/webgl/WebGLBackground.js

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,16 @@ import { Mesh } from '../../objects/Mesh.js';
88
import { ShaderLib } from '../shaders/ShaderLib.js';
99
import { cloneUniforms, getUnlitUniformColorSpace } from '../shaders/UniformsUtils.js';
1010

11+
import * as backgroundColor from '../shaders/ShaderLib/backgroundColor.glsl.js';
12+
1113
const _rgb = { r: 0, b: 0, g: 0 };
1214

1315
function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha, premultipliedAlpha ) {
1416

1517
const clearColor = new Color( 0x000000 );
1618
let clearAlpha = alpha === true ? 0 : 1;
1719

20+
let colorMesh;
1821
let planeMesh;
1922
let boxMesh;
2023

@@ -24,7 +27,6 @@ function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha,
2427

2528
function render( renderList, scene ) {
2629

27-
let forceClear = false;
2830
let background = scene.isScene === true ? scene.background : null;
2931

3032
if ( background && background.isTexture ) {
@@ -38,11 +40,6 @@ function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha,
3840

3941
setClear( clearColor, clearAlpha );
4042

41-
} else if ( background && background.isColor ) {
42-
43-
setClear( background, 1 );
44-
forceClear = true;
45-
4643
}
4744

4845
const environmentBlendMode = renderer.xr.getEnvironmentBlendMode();
@@ -57,7 +54,7 @@ function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha,
5754

5855
}
5956

60-
if ( renderer.autoClear || forceClear ) {
57+
if ( renderer.autoClear ) {
6158

6259
renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );
6360

@@ -192,6 +189,39 @@ function WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha,
192189
// push to the pre-sorted opaque render list
193190
renderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null );
194191

192+
} else if ( background && background.isColor ) {
193+
194+
if ( colorMesh === undefined ) {
195+
196+
colorMesh = new Mesh(
197+
new PlaneGeometry( 2, 2 ),
198+
new ShaderMaterial( {
199+
name: 'BackgroundMaterial',
200+
uniforms: {
201+
color: { value: /*@__PURE__*/ new Color() }
202+
},
203+
vertexShader: backgroundColor.vertex,
204+
fragmentShader: backgroundColor.fragment,
205+
side: FrontSide,
206+
depthTest: false,
207+
depthWrite: false,
208+
fog: false
209+
} )
210+
);
211+
212+
colorMesh.geometry.deleteAttribute( 'normal' );
213+
colorMesh.geometry.deleteAttribute( 'uv' );
214+
215+
objects.update( colorMesh );
216+
217+
}
218+
219+
colorMesh.material.uniforms.color.value.copy( background ).multiplyScalar( scene.backgroundIntensity );
220+
colorMesh.layers.enableAll();
221+
222+
// push to the pre-sorted opaque render list
223+
renderList.unshift( colorMesh, colorMesh.geometry, colorMesh.material, 0, 0, null );
224+
195225
}
196226

197227
}

0 commit comments

Comments
 (0)