Skip to content

decode.webgpu.Class.GainMapNode

github-actions[bot] edited this page Oct 19, 2026 · 3 revisions

@monogrid/gainmap-js / decode/webgpu / GainMapNode

Class: GainMapNode

Defined in: src/decode/webgpu/nodes/GainMapNode.ts:71

A TSL texture node holding the HDR image decoded from an SDR image + gain map.

The decode runs on the GPU into a HalfFloat render target, and only when something changed (textures loaded/swapped or any uniform value changed): sampling the node costs a single texture read, like any other texture.

The node updates itself before rendering whenever it is part of a rendered node graph (material, scene.backgroundNode, ...). When only its texture is used (node.value, e.g. scene.environment = node.value) call GainMapNode.decode yourself.

Re-decoding also flags the texture for PMREM regeneration, so environment maps are recomputed only when the image actually changes.

node.value gets its final size once loaded: three.js PMREMs don't follow texture resizes, so assign it to scene.environment (or pmremTexture()) after load.

Example

import { GainMapNode } from '@monogrid/gainmap-js/webgpu'
import { equirectUV } from 'three/tsl'

const hdr = new GainMapNode()
  .setTextures(sdrTexture, gainMapTexture)
  .setMetadata(metadata)

material.colorNode = hdr
scene.backgroundNode = hdr.sample(equirectUV())
hdr.maxDisplayBoost.value = 2 // re-decodes once, on the next frame

Extends

Constructors

Constructor

new GainMapNode(): GainMapNode

Defined in: src/decode/webgpu/nodes/GainMapNode.ts:83

Returns

GainMapNode

Overrides

RenderTargetNode.constructor

Properties

_material

protected _material: NodeMaterial

Defined in: src/core/webgpu/RenderTargetNode.ts:42

Inherited from

RenderTargetNode._material


_quadMesh

protected _quadMesh: QuadMesh

Defined in: src/core/webgpu/RenderTargetNode.ts:41

Inherited from

RenderTargetNode._quadMesh


renderTarget

readonly renderTarget: RenderTarget

Defined in: src/core/webgpu/RenderTargetNode.ts:33

The render target holding the result

Inherited from

RenderTargetNode.renderTarget


revision

revision: number = 0

Defined in: src/core/webgpu/RenderTargetNode.ts:39

Incremented every time the render target is rendered, nodes depending on this one use it to know when to render again

Inherited from

RenderTargetNode.revision


uniforms

readonly uniforms: GainMapNodeUniforms

Defined in: src/decode/webgpu/nodes/GainMapNode.ts:77

Shared textures and uniforms

Accessors

gainMap

Get Signature

get gainMap(): Texture<unknown, TextureEventMap>

Defined in: src/decode/webgpu/nodes/GainMapNode.ts:118

The gain map recovery texture (linear)

Returns

Texture<unknown, TextureEventMap>


gainMapMax

Get Signature

get gainMapMax(): UniformNode<"vec3", Vector3>

Defined in: src/decode/webgpu/nodes/GainMapNode.ts:129

See

GainMapMetadata.gainMapMax

Returns

UniformNode<"vec3", Vector3>


gainMapMin

Get Signature

get gainMapMin(): UniformNode<"vec3", Vector3>

Defined in: src/decode/webgpu/nodes/GainMapNode.ts:127

See

GainMapMetadata.gainMapMin

Returns

UniformNode<"vec3", Vector3>


gamma

Get Signature

get gamma(): UniformNode<"vec3", Vector3>

Defined in: src/decode/webgpu/nodes/GainMapNode.ts:121

See

GainMapMetadata.gamma

Returns

UniformNode<"vec3", Vector3>


hdrCapacityMax

Get Signature

get hdrCapacityMax(): UniformNode<"float", number>

Defined in: src/decode/webgpu/nodes/GainMapNode.ts:133

See

GainMapMetadata.hdrCapacityMax

Returns

UniformNode<"float", number>


hdrCapacityMin

Get Signature

get hdrCapacityMin(): UniformNode<"float", number>

Defined in: src/decode/webgpu/nodes/GainMapNode.ts:131

See

GainMapMetadata.hdrCapacityMin

Returns

UniformNode<"float", number>


height

Get Signature

get height(): number

Defined in: src/decode/webgpu/nodes/GainMapNode.ts:147

Height of the SDR image, 0 until loaded

Returns

number

Overrides

RenderTargetNode.height


maxDisplayBoost

Get Signature

get maxDisplayBoost(): UniformNode<"float", number>

Defined in: src/decode/webgpu/nodes/GainMapNode.ts:138

See

GainmapDecodingParameters.maxDisplayBoost

Remarks

Non Logarithmic space

Returns

UniformNode<"float", number>


offsetHdr

Get Signature

get offsetHdr(): UniformNode<"vec3", Vector3>

Defined in: src/decode/webgpu/nodes/GainMapNode.ts:125

See

GainMapMetadata.offsetHdr

Returns

UniformNode<"vec3", Vector3>


offsetSdr

Get Signature

get offsetSdr(): UniformNode<"vec3", Vector3>

Defined in: src/decode/webgpu/nodes/GainMapNode.ts:123

See

GainMapMetadata.offsetSdr

Returns

UniformNode<"vec3", Vector3>


sdr

Get Signature

get sdr(): Texture<unknown, TextureEventMap>

Defined in: src/decode/webgpu/nodes/GainMapNode.ts:116

The SDR rendition texture (sRGB)

Returns

Texture<unknown, TextureEventMap>


value

Get Signature

get value(): Texture

Defined in: src/core/webgpu/RenderTargetNode.ts:139

Returns

Texture

Set Signature

set value(value): void

Defined in: src/core/webgpu/RenderTargetNode.ts:133

Parameters
value

Texture

Returns

void

Inherited from

RenderTargetNode.value


width

Get Signature

get width(): number

Defined in: src/decode/webgpu/nodes/GainMapNode.ts:141

Width of the SDR image, 0 until loaded

Returns

number

Overrides

RenderTargetNode.width


type

Get Signature

get static type(): string

Defined in: src/decode/webgpu/nodes/GainMapNode.ts:72

Returns

string

Methods

_getDependencies()

protected _getDependencies(): RenderTargetNode[]

Defined in: src/decode/webgpu/nodes/GainMapNode.ts:201

Render target nodes read by this node, rendered (if needed) before this one

Returns

RenderTargetNode[]

Overrides

RenderTargetNode._getDependencies


_getState()

protected _getState(): number[]

Defined in: src/decode/webgpu/nodes/GainMapNode.ts:191

Values the result depends on, compared with === to the ones of the last render

Returns

number[]

Overrides

RenderTargetNode._getState


_onRender()

protected _onRender(): void

Defined in: src/decode/webgpu/nodes/GainMapNode.ts:208

Called after the render target has been rendered

Returns

void

Overrides

RenderTargetNode._onRender


clone()

clone(): GainMapNode

Defined in: src/core/webgpu/RenderTargetNode.ts:147

Clones created by sample() & co. are plain TextureNodes reading this node's texture, they keep it updated before rendering as well

Returns

GainMapNode

Inherited from

RenderTargetNode.clone


decode()

decode(renderer): boolean

Defined in: src/decode/webgpu/nodes/GainMapNode.ts:220

Decodes the image into GainMapNode.renderTarget, only if something changed since the last decode.

Called automatically when the node is part of a rendered node graph.

Parameters

renderer

WebGPURenderer

Returns

boolean

true if the image was decoded


dispose()

dispose(): void

Defined in: src/decode/webgpu/nodes/GainMapNode.ts:238

Disposes the render target, the SDR and gain map textures (unless they belong to other render target nodes)

Returns

void

Overrides

RenderTargetNode.dispose


invalidate()

invalidate(): GainMapNode

Defined in: src/core/webgpu/RenderTargetNode.ts:87

Forces a render the next time RenderTargetNode.render is called, use it when something the node can't track changed (e.g. a custom input node)

Returns

GainMapNode

Inherited from

RenderTargetNode.invalidate


render()

render(renderer): boolean

Defined in: src/core/webgpu/RenderTargetNode.ts:100

Renders into RenderTargetNode.renderTarget, only if something changed since the last render.

Called automatically when the node is part of a rendered node graph.

Parameters

renderer

WebGPURenderer

Returns

boolean

true if the render target was rendered

Inherited from

RenderTargetNode.render


setMetadata()

setMetadata(metadata): GainMapNode

Defined in: src/decode/webgpu/nodes/GainMapNode.ts:178

Copies the gain map metadata into the uniforms. Also sets maxDisplayBoost to fully restore the HDR range.

Parameters

metadata

GainMapMetadata

Returns

GainMapNode


setTextures()

setTextures(sdr, gainMap): GainMapNode

Defined in: src/decode/webgpu/nodes/GainMapNode.ts:162

Sets the SDR and gain map textures. The SDR texture is expected in sRGB color space, the gain map in linear.

Render target nodes (e.g. the sdr and gainMap nodes of a GainMapEncoder) are accepted as well: they are rendered before decoding and the image is decoded again whenever they change.

Parameters

sdr

Texture<unknown, TextureEventMap> | RenderTargetNode

gainMap

Texture<unknown, TextureEventMap> | RenderTargetNode

Returns

GainMapNode


updateBefore()

updateBefore(frame): undefined

Defined in: src/decode/webgpu/nodes/GainMapNode.ts:229

Calls GainMapNode.decode once per render, before the node is evaluated.

Parameters

frame

NodeFrame

Returns

undefined

Overrides

RenderTargetNode.updateBefore

Clone this wiki locally