Skip to content

Documentation / scene / Bloom

Class: Bloom ​

Defined in: libs/scene/src/posteffect/bloom.ts:14

The bloom post effect

Extends ​

Constructors ​

Constructor ​

new Bloom(): Bloom

Defined in: libs/scene/src/posteffect/bloom.ts:41

Creates an instance of tonemap post effect

Returns ​

Bloom

Overrides ​

AbstractPostEffect.constructor

Properties ​

className ​

readonly static className: "Bloom"

Defined in: libs/scene/src/posteffect/bloom.ts:15


_enabled ​

protected _enabled: boolean

Defined in: libs/scene/src/posteffect/posteffect.ts:118

Inherited from ​

AbstractPostEffect._enabled


_layer ​

protected _layer: PostEffectLayer

Defined in: libs/scene/src/posteffect/posteffect.ts:119

Inherited from ​

AbstractPostEffect._layer

Accessors ​

disposed ​

Get Signature ​

get disposed(): boolean

Defined in: libs/base/dist/index.d.ts:6107

Returns ​

boolean

Inherited from ​

AbstractPostEffect.disposed


maxDownsampleLevel ​

Get Signature ​

get maxDownsampleLevel(): number

Defined in: libs/scene/src/posteffect/bloom.ts:58

The maximum downsample levels

Returns ​

number

Set Signature ​

set maxDownsampleLevel(val): void

Defined in: libs/scene/src/posteffect/bloom.ts:61

Parameters ​
val ​

number

Returns ​

void


downsampleLimit ​

Get Signature ​

get downsampleLimit(): number

Defined in: libs/scene/src/posteffect/bloom.ts:65

Downsample resolution limitation

Returns ​

number

Set Signature ​

set downsampleLimit(val): void

Defined in: libs/scene/src/posteffect/bloom.ts:68

Parameters ​
val ​

number

Returns ​

void


threshold ​

Get Signature ​

get threshold(): number

Defined in: libs/scene/src/posteffect/bloom.ts:89

Luminance above which a pixel starts to bloom.

Remarks ​

Compared against the value in the color buffer, whose meaning depends on the scene's lighting mode -- the same number is a different physical brightness in each:

  • legacy: the buffer is display-referred, so the default 0.8 means "near white".
  • physical: the buffer holds camera pre-exposed luminance. 0.8 then corresponds to 0.8 / cameraExposure cd/m², which at the Sunny-16 reference is ~30,700 cd/m² -- almost exactly a white surface in direct sunlight (~31,800). Little in an ordinary daylight scene is brighter than that, so only genuine emitters and specular highlights bloom.

Physical scenes that want a more pronounced glow should lower this: ~0.3 makes a white surface bloom, ~0.15 catches everything above mid-gray. Because the buffer is pre-exposed, a fixed threshold tracks the camera -- stopping down dims the scene and reduces what blooms, as it would on a real sensor.

Returns ​

number

Set Signature ​

set threshold(val): void

Defined in: libs/scene/src/posteffect/bloom.ts:92

Parameters ​
val ​

number

Returns ​

void


thresholdKnee ​

Get Signature ​

get thresholdKnee(): number

Defined in: libs/scene/src/posteffect/bloom.ts:96

Bloom threshold knee

Returns ​

number

Set Signature ​

set thresholdKnee(val): void

Defined in: libs/scene/src/posteffect/bloom.ts:99

Parameters ​
val ​

number

Returns ​

void


intensity ​

Get Signature ​

get intensity(): number

Defined in: libs/scene/src/posteffect/bloom.ts:103

Bloom intensity

Returns ​

number

Set Signature ​

set intensity(val): void

Defined in: libs/scene/src/posteffect/bloom.ts:106

Parameters ​
val ​

number

Returns ​

void


filterRadius ​

Get Signature ​

get filterRadius(): number

Defined in: libs/scene/src/posteffect/bloom.ts:119

Radius of the 3x3 tent filter used when upsampling the pyramid, in source texels.

Remarks ​

1 is the natural width and what the Call of Duty presentation uses. Raising it spreads each level further and softens the halo, at the cost of the tent's taps drifting apart: past ~2 the three lobes stop overlapping and the filter reintroduces the very grid pattern it exists to remove. Lowering it toward 0 collapses the filter back to a plain bilinear tap and the blocky banding returns.

Returns ​

number

Set Signature ​

set filterRadius(val): void

Defined in: libs/scene/src/posteffect/bloom.ts:122

Parameters ​
val ​

number

Returns ​

void


karisAverage ​

Get Signature ​

get karisAverage(): boolean

Defined in: libs/scene/src/posteffect/bloom.ts:135

Whether the first downsample weights its taps by 1 / (1 + luma) (the "Karis average").

Remarks ​

Suppresses the fireflies a single blown-out specular texel produces: without it, such a texel dominates its 2x2 group and flickers as the surface moves, since whether a normal map lands on NdotL ~ 1 changes frame to frame. The trade is a slightly dimmer, slightly tighter halo, because the weighting deliberately holds the brightest samples back. Turn it off for a static scene that wants maximum reach and has no high-frequency speculars to stabilize.

Returns ​

boolean

Set Signature ​

set karisAverage(val): void

Defined in: libs/scene/src/posteffect/bloom.ts:138

Parameters ​
val ​

boolean

Returns ​

void


enabled ​

Get Signature ​

get enabled(): boolean

Defined in: libs/scene/src/posteffect/posteffect.ts:130

Whether this post effect is enabled

Returns ​

boolean

Set Signature ​

set enabled(val): void

Defined in: libs/scene/src/posteffect/posteffect.ts:133

Parameters ​
val ​

boolean

Returns ​

void

Inherited from ​

AbstractPostEffect.enabled


layer ​

Get Signature ​

get layer(): PostEffectLayer

Defined in: libs/scene/src/posteffect/posteffect.ts:137

Whether this post effect will be rendered at opaque phase

Returns ​

PostEffectLayer

Inherited from ​

AbstractPostEffect.layer

Methods ​

on() ​

on<K>(type, listener, context?): void

Defined in: libs/base/dist/index.d.ts:630

IEventTarget.on

Type Parameters ​

K ​

K extends "dispose"

Parameters ​

type ​

K

listener ​

EventListener<{ dispose: []; }, K>

context? ​

unknown

Returns ​

void

Inherited from ​

AbstractPostEffect.on


once() ​

once<K>(type, listener, context?): void

Defined in: libs/base/dist/index.d.ts:634

IEventTarget.once

Type Parameters ​

K ​

K extends "dispose"

Parameters ​

type ​

K

listener ​

EventListener<{ dispose: []; }, K>

context? ​

unknown

Returns ​

void

Inherited from ​

AbstractPostEffect.once


off() ​

off<K>(type, listener?, context?): void

Defined in: libs/base/dist/index.d.ts:638

IEventTarget.off

Type Parameters ​

K ​

K extends "dispose"

Parameters ​

type ​

K

listener? ​

EventListener<{ dispose: []; }>

context? ​

unknown

Returns ​

void

Inherited from ​

AbstractPostEffect.off


dispatchEvent() ​

dispatchEvent<K>(type, ...args): void

Defined in: libs/base/dist/index.d.ts:642

IEventTarget.dispatchEvent

Type Parameters ​

K ​

K extends "dispose"

Parameters ​

type ​

K

args ​

...object[K]

Returns ​

void

Inherited from ​

AbstractPostEffect.dispatchEvent


dispose() ​

dispose(): void

Defined in: libs/base/dist/index.d.ts:6108

Returns ​

void

Inherited from ​

AbstractPostEffect.dispose


requireLinearDepthTexture() ​

requireLinearDepthTexture(): boolean

Defined in: libs/scene/src/posteffect/bloom.ts:142

Checks whether this post effect requires the linear depth texture

Returns ​

boolean

true if the linear depth texture is required.

Overrides ​

AbstractPostEffect.requireLinearDepthTexture


requireDepthAttachment() ​

requireDepthAttachment(): boolean

Defined in: libs/scene/src/posteffect/bloom.ts:146

Checks whether this post effect requires the scene depth buffer

Returns ​

boolean

true if the scene depth buffer is required.

Overrides ​

AbstractPostEffect.requireDepthAttachment


setup() ​

setup(s): RGHandle

Defined in: libs/scene/src/posteffect/bloom.ts:156

Declare this effect's passes on the render graph.

The default implementation wraps AbstractPostEffect.apply into a single graph pass, so effects only overriding apply() work unchanged. Multi-pass effects override this method to declare each internal step as its own pass, calling PostEffectSetupContext.createOutput inside the final pass.

Parameters ​

s ​

PostEffectSetupContext

Build-time setup context.

Returns ​

RGHandle

The effect's output color handle.

Overrides ​

AbstractPostEffect.setup


apply() ​

apply(ctx, inputColorTexture, _sceneDepthTexture, srgbOutput): void

Defined in: libs/scene/src/posteffect/bloom.ts:300

Apply the post effect

Parameters ​

ctx ​

DrawContext

inputColorTexture ​

Texture2D

The previous scene color texture

_sceneDepthTexture ​

Texture2D

The linear scene depth texture

srgbOutput ​

boolean

Whether the result should be gamma corrected

Returns ​

void

Remarks ​

The frame buffer of the post effect is already set when apply() is called.

Overrides ​

AbstractPostEffect.apply


needFlip() ​

needFlip(device): boolean

Defined in: libs/scene/src/posteffect/posteffect.ts:145

Check if the post effect should be rendered upside down.

Parameters ​

device ​

AbstractDevice

The device object

Returns ​

boolean

true if the post effect should be rendered upside down

Inherited from ​

AbstractPostEffect.needFlip


requireMotionVectorTexture() ​

requireMotionVectorTexture(_ctx): boolean

Defined in: libs/scene/src/posteffect/posteffect.ts:166

Checks whether this post effect requires the motion vector texture

Parameters ​

_ctx ​

DrawContext

Returns ​

boolean

true if the motion vector texture is required.

Inherited from ​

AbstractPostEffect.requireMotionVectorTexture


requireHiZTexture() ​

requireHiZTexture(_ctx): boolean

Defined in: libs/scene/src/posteffect/posteffect.ts:170

Checks whether this post effect requires the Hi-Z depth pyramid.

Parameters ​

_ctx ​

DrawContext

Returns ​

boolean

Inherited from ​

AbstractPostEffect.requireHiZTexture


requireHiZNearest() ​

requireHiZNearest(_ctx): boolean

Defined in: libs/scene/src/posteffect/posteffect.ts:181

Checks whether this post effect requires the Hi-Z pyramid's nearest-depth channel, which answers "how close is the nearest surface in this screen region" rather than the farthest-depth channel's occlusion question.

Implies AbstractPostEffect.requireHiZTexture; an effect that needs the nearest channel does not have to request the pyramid separately.

Parameters ​

_ctx ​

DrawContext

Returns ​

boolean

Inherited from ​

AbstractPostEffect.requireHiZNearest


requireSceneNormalTexture() ​

requireSceneNormalTexture(_ctx): boolean

Defined in: libs/scene/src/posteffect/posteffect.ts:185

Checks whether this post effect requires opaque-scene world normals.

Parameters ​

_ctx ​

DrawContext

Returns ​

boolean

Inherited from ​

AbstractPostEffect.requireSceneNormalTexture


requireSceneRoughnessTexture() ​

requireSceneRoughnessTexture(_ctx): boolean

Defined in: libs/scene/src/posteffect/posteffect.ts:189

Checks whether this post effect requires opaque-scene roughness data.

Parameters ​

_ctx ​

DrawContext

Returns ​

boolean

Inherited from ​

AbstractPostEffect.requireSceneRoughnessTexture


requireShadowMask() ​

requireShadowMask(_ctx): boolean

Defined in: libs/scene/src/posteffect/posteffect.ts:200

Checks whether this post effect requires the screen-space shadow mask.

When true and the mask was produced this frame, the effect can sample DrawContext.shadowMaskTexture in its apply() body; the graph keeps the mask alive for the effect's pass.

Parameters ​

_ctx ​

DrawContext

Returns ​

boolean

true if the shadow mask is required.

Inherited from ​

AbstractPostEffect.requireShadowMask


passThrough() ​

protected passThrough(ctx, inputColorTexture, srgbOutput, renderStates?): void

Defined in: libs/scene/src/posteffect/posteffect.ts:344

Parameters ​

ctx ​

DrawContext

Draw context

inputColorTexture ​

Texture2D

Input color texture

srgbOutput ​

boolean

Whether the result should be gamma corrected

renderStates? ​

RenderStateSet

Returns ​

void

Inherited from ​

AbstractPostEffect.passThrough


drawFullscreenQuad() ​

protected drawFullscreenQuad(renderStateSet?): void

Defined in: libs/scene/src/posteffect/posteffect.ts:363

Draws a fullscreen quad

Parameters ​

renderStateSet? ​

RenderStateSet

Render states that will be used when drawing the fullscreen quad.

Returns ​

void

Inherited from ​

AbstractPostEffect.drawFullscreenQuad


onDispose() ​

protected onDispose(): void

Defined in: libs/scene/src/posteffect/posteffect.ts:376

Returns ​

void

Inherited from ​

AbstractPostEffect.onDispose

Released under the MIT License.