Skip to content

Commit 3f2956c

Browse files
authored
TSL: Color Space revision (#29248)
* Rev `currentColorSpace` and added `currentToneMapping` * fix imports * Update ColorSpaceNode.js * cleanup * improve tsl colorspace names
1 parent 8ce2bc4 commit 3f2956c

File tree

8 files changed

+32
-35
lines changed

8 files changed

+32
-35
lines changed

examples/webgpu_sandbox.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
<script type="importmap">
1515
{
1616
"imports": {
17-
"three": "../src/Three.WebGPU.js",
18-
"three/tsl": "../src/Three.WebGPU.js",
17+
"three": "../build/three.webgpu.js",
18+
"three/tsl": "../build/three.webgpu.js",
1919
"three/debug": "../src/Three.WebGPU.js",
2020
"three/addons/": "./jsm/"
2121
}

src/nodes/TSL.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ export * from './accessors/VelocityNode.js';
8585
export * from './display/BlendMode.js';
8686
export { default as BumpMapNode, bumpMap } from './display/BumpMapNode.js';
8787
export * from './display/ColorAdjustment.js';
88-
export { default as ColorSpaceNode, linearToColorSpace, colorSpaceToLinear } from './display/ColorSpaceNode.js';
88+
export { default as ColorSpaceNode, linearSRGBToColorSpace, colorSpaceToLinearSRGB } from './display/ColorSpaceNode.js';
8989
export { default as FrontFacingNode, frontFacing, faceDirection } from './display/FrontFacingNode.js';
9090
export { default as NormalMapNode, normalMap } from './display/NormalMapNode.js';
9191
export { default as PosterizeNode, posterize } from './display/PosterizeNode.js';

src/nodes/accessors/TextureNode.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { registerNodeClass } from '../core/Node.js';
22
import UniformNode, { uniform } from '../core/UniformNode.js';
33
import { uv } from './UV.js';
44
import { textureSize } from './TextureSizeNode.js';
5-
import { colorSpaceToLinear } from '../display/ColorSpaceNode.js';
5+
import { colorSpaceToLinearSRGB } from '../display/ColorSpaceNode.js';
66
import { expression } from '../code/ExpressionNode.js';
77
import { maxMipLevel } from '../utils/MaxMipLevelNode.js';
88
import { nodeProxy, vec3, nodeObject } from '../tsl/TSLBase.js';
@@ -274,9 +274,9 @@ class TextureNode extends UniformNode {
274274
let snippet = propertyName;
275275
const nodeType = this.getNodeType( builder );
276276

277-
if ( builder.needsColorSpaceToLinear( texture ) ) {
277+
if ( builder.needsColorSpaceToLinearSRGB( texture ) ) {
278278

279-
snippet = colorSpaceToLinear( expression( snippet, nodeType ), texture.colorSpace ).setup( builder ).build( builder, nodeType );
279+
snippet = colorSpaceToLinearSRGB( expression( snippet, nodeType ), texture.colorSpace ).setup( builder ).build( builder, nodeType );
280280

281281
}
282282

src/nodes/core/NodeBuilder.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -605,7 +605,7 @@ class NodeBuilder {
605605

606606
}
607607

608-
needsColorSpaceToLinear( /*texture*/ ) {
608+
needsColorSpaceToLinearSRGB( /*texture*/ ) {
609609

610610
return false;
611611

src/nodes/display/ColorSpaceNode.js

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,28 +30,31 @@ export const getColorSpaceMethod = ( source, target ) => {
3030

3131
class ColorSpaceNode extends TempNode {
3232

33-
constructor( colorSpace, colorNode ) {
33+
constructor( colorNode, target = null, source = null ) {
3434

3535
super( 'vec4' );
3636

37-
this.colorSpace = colorSpace;
3837
this.colorNode = colorNode;
38+
this.target = target;
39+
this.source = source;
3940

4041
}
4142

4243
setup( builder ) {
4344

44-
const { colorSpace, colorNode } = this;
45+
const { renderer, context } = builder;
4546

46-
if ( colorSpace === ColorSpaceNode.LINEAR_TO_LINEAR ) {
47+
const source = this.source || context.outputColorSpace || renderer.outputColorSpace;
48+
const target = this.target || context.outputColorSpace || renderer.outputColorSpace;
49+
const colorNode = this.colorNode;
4750

48-
return colorNode;
51+
if ( source === target ) return colorNode;
4952

50-
}
53+
const colorSpace = getColorSpaceMethod( source, target );
5154

5255
let outputNode = null;
5356

54-
const colorSpaceFn = builder.renderer.nodes.library.getColorSpaceFunction( colorSpace );
57+
const colorSpaceFn = renderer.nodes.library.getColorSpaceFunction( colorSpace );
5558

5659
if ( colorSpaceFn !== null ) {
5760

@@ -71,14 +74,12 @@ class ColorSpaceNode extends TempNode {
7174

7275
}
7376

74-
ColorSpaceNode.LINEAR_TO_LINEAR = 'LinearToLinear';
75-
7677
export default ColorSpaceNode;
7778

7879
registerNodeClass( 'ColorSpace', ColorSpaceNode );
7980

80-
export const linearToColorSpace = ( node, colorSpace ) => nodeObject( new ColorSpaceNode( getColorSpaceMethod( LinearSRGBColorSpace, colorSpace ), nodeObject( node ) ) );
81-
export const colorSpaceToLinear = ( node, colorSpace ) => nodeObject( new ColorSpaceNode( getColorSpaceMethod( colorSpace, LinearSRGBColorSpace ), nodeObject( node ) ) );
81+
export const linearSRGBToColorSpace = ( node, colorSpace = null ) => nodeObject( new ColorSpaceNode( nodeObject( node ), colorSpace, LinearSRGBColorSpace ) );
82+
export const colorSpaceToLinearSRGB = ( node, colorSpace = null ) => nodeObject( new ColorSpaceNode( nodeObject( node ), LinearSRGBColorSpace, colorSpace ) );
8283

83-
addMethodChaining( 'linearToColorSpace', linearToColorSpace );
84-
addMethodChaining( 'colorSpaceToLinear', colorSpaceToLinear );
84+
addMethodChaining( 'linearSRGBToColorSpace', linearSRGBToColorSpace );
85+
addMethodChaining( 'colorSpaceToLinearSRGB', colorSpaceToLinearSRGB );

src/nodes/display/RenderOutputNode.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class RenderOutputNode extends TempNode {
3737

3838
if ( outputColorSpace === SRGBColorSpace ) {
3939

40-
outputNode = outputNode.linearToColorSpace( outputColorSpace );
40+
outputNode = outputNode.linearSRGBToColorSpace( outputColorSpace );
4141

4242
}
4343

src/renderers/common/Renderer.js

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import { Vector2 } from '../../math/Vector2.js';
2525
import { Vector3 } from '../../math/Vector3.js';
2626
import { Vector4 } from '../../math/Vector4.js';
2727
import { RenderTarget } from '../../core/RenderTarget.js';
28-
import { DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoColorSpace, NoToneMapping, LinearFilter, LinearSRGBColorSpace, HalfFloatType, RGBAFormat, PCFShadowMap } from '../../constants.js';
28+
import { DoubleSide, BackSide, FrontSide, SRGBColorSpace, NoToneMapping, LinearFilter, LinearSRGBColorSpace, HalfFloatType, RGBAFormat, PCFShadowMap } from '../../constants.js';
2929

3030
const _scene = /*@__PURE__*/ new Scene();
3131
const _drawingBufferSize = /*@__PURE__*/ new Vector2();
@@ -493,10 +493,10 @@ class Renderer {
493493

494494
_getFrameBufferTarget() {
495495

496-
const { currentColorSpace } = this;
496+
const { currentToneMapping, currentColorSpace } = this;
497497

498-
const useToneMapping = this._renderTarget === null && ( this.toneMapping !== NoToneMapping );
499-
const useColorSpace = this._renderTarget === null && ( currentColorSpace !== LinearSRGBColorSpace && currentColorSpace !== NoColorSpace );
498+
const useToneMapping = currentToneMapping !== NoToneMapping;
499+
const useColorSpace = currentColorSpace !== LinearSRGBColorSpace;
500500

501501
if ( useToneMapping === false && useColorSpace === false ) return null;
502502

@@ -1088,19 +1088,15 @@ class Renderer {
10881088

10891089
}
10901090

1091-
get currentColorSpace() {
1092-
1093-
const renderTarget = this._renderTarget;
1094-
1095-
if ( renderTarget !== null ) {
1091+
get currentToneMapping() {
10961092

1097-
const texture = renderTarget.texture;
1093+
return this._renderTarget !== null ? NoToneMapping : this.toneMapping;
10981094

1099-
return ( Array.isArray( texture ) ? texture[ 0 ] : texture ).colorSpace;
1095+
}
11001096

1101-
}
1097+
get currentColorSpace() {
11021098

1103-
return this.outputColorSpace;
1099+
return this._renderTarget !== null ? LinearSRGBColorSpace : this.outputColorSpace;
11041100

11051101
}
11061102

src/renderers/webgpu/nodes/WGSLNodeBuilder.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ class WGSLNodeBuilder extends NodeBuilder {
163163

164164
}
165165

166-
needsColorSpaceToLinear( texture ) {
166+
needsColorSpaceToLinearSRGB( texture ) {
167167

168168
return texture.isVideoTexture === true && texture.colorSpace !== NoColorSpace;
169169

0 commit comments

Comments
 (0)