Glow Effect Settings - ApertureViewer/Aperture-Viewer GitHub Wiki
Technical Deep Dive: Analysis and Configuration of Glow Effect Settings
1. Introduction to the Glow Effect
The Glow effect, often referred to as Bloom, is a common post-processing technique used in computer graphics to simulate the visual phenomenon where bright light sources or highlights appear to bleed light into their surrounding area, creating a soft halo or fringe. Within the Second Life viewer, the Glow effect significantly enhances the visual impact and perceived brightness of emissive objects (lights, signs, glowing prims), specular highlights, sky elements, and other luminous parts of the scene, contributing to overall visual richness and realism.
The implementation involves several stages executed on the GPU after the main scene rendering is complete but before the final image is presented:
- Extraction: Identifying and isolating pixels in the scene that exceed a certain brightness threshold. Crucially, as of recent changes (Ref: Commit
b44ad50f757), this extraction step operates on the tonemapped/gamma-corrected image (mPostMap), not the raw linear scene colors. - Downscaling: The extracted brightness information is rendered into lower-resolution buffers (
mGlowbuffers) to optimize the subsequent blurring steps. - Blurring: A significant blur (typically a separable Gaussian blur achieved through multiple passes) is applied to the downscaled brightness map.
- Compositing: The final blurred glow map is blended (usually additively) back onto the tonemapped scene image before final presentation (potentially combined with other effects like FXAA).
The following settings provide control over various aspects of this process, allowing for artistic adjustment and performance scaling.
2. Analysis of Individual Glow Settings
Setting: RenderGlow
- Type:
Boolean - 1. Function/Purpose: Master control to enable or disable the entire Glow post-processing effect.
- 2. Code Usage/Implementation: Checked at the beginning of the glow generation logic (e.g.,
LLPipeline::renderGlow). Iffalse(!sRenderGlow), the extraction and blur passes are skipped, potentially just clearing an intermediate buffer (mGlow[1]) to avoid artifacts. - 3. Performance Impact:
- Enabled (
true): Adds significant GPU load due to the multiple render passes (extraction, blur iterations) and increases VRAM usage for themGlowintermediate buffers. The cost scales with resolution (RenderGlowResolutionPow) and iterations (RenderGlowIterations). - Disabled (
false): Eliminates the GPU and VRAM cost associated with the Glow effect, providing a noticeable performance improvement.
- Enabled (
- 4. Visual Impact:
- Enabled (
true): Adds the characteristic bloom/halo effect around bright areas of the scene. - Disabled (
false): Renders the scene without bloom; bright areas appear sharper without the soft halo.
- Enabled (
- 5. Default Value: Typically
trueon medium-to-high graphics presets,falseon low presets. - 6. Recommended Value:
- Max Fidelity/Visuals:
true. - Max Performance:
false.
- Max Fidelity/Visuals:
Setting: RenderGlowHDR
- Type:
Boolean - 1. Function/Purpose: Determines the color precision format of the intermediate
mGlowbuffers. - 2. Code Usage/Implementation: Checked during buffer allocation (
LLPipeline::createGLBuffers). Iftrue, buffers use a high dynamic range format (e.g.,GL_RGBA16F- 16 bits per channel, floating-point). Iffalse, uses a standard format (e.g.,GL_RGBA- 8 bits per channel, integer). Requires buffer reallocation if changed. - 3. Performance Impact:
- Enabled (
true): Doubles the VRAM requirement for the glow buffers compared to 8-bit format. May have a minor impact on GPU bandwidth/processing speed during blur passes. - Disabled (
false): Uses less VRAM for glow buffers.
- Enabled (
- 4. Visual Impact:
- Enabled (
true): Allows for a wider range of brightness values within the glow effect, reducing or eliminating visible banding artifacts in smooth glow gradients and potentially allowing for brighter, more intense bloom effects without premature clipping. Most beneficial when overall HDR rendering is active. - Disabled (
false): Limits the brightness range, potentially causing clamping (loss of detail in very bright glows) and increasing the likelihood of visible banding artifacts, especially in smooth, broad glows.
- Enabled (
- 5. Default Value: Likely
truefor High/Ultra presets, potentiallyfalseotherwise. - 6. Recommended Value:
- Max Fidelity:
true. - Max Performance / VRAM Constrained:
false. (Consider linking to quality presets internally).
- Max Fidelity:
Setting: RenderGlowResolutionPow
- Type:
S32(Integer) - 1. Function/Purpose: Controls the resolution of the intermediate
mGlowbuffers used for blurring. The actual resolution is calculated as1 << RenderGlowResolutionPow, typically clamped (e.g., 1 to 512 or 1024). Lower values yield lower resolution buffers. - 2. Code Usage/Implementation: Read during buffer allocation (
LLPipeline::createGLBuffers) to determine the size ofmGlowtextures. Also used inrenderGlowlogic to potentially adjust the blurdelta(RenderGlowWidthscaling) to maintain a similar visual appearance across different resolutions. Requires buffer reallocation if changed. - 3. Performance Impact:
- Higher Value: Significantly increases VRAM usage (quadratically with resolution). Increases GPU load during blur passes (more pixels to process). Major performance factor.
- Lower Value: Decreases VRAM usage and GPU load for blur passes.
- 4. Visual Impact:
- Higher Value: Produces a smoother, potentially sharper, and higher-fidelity glow effect with fewer blocky artifacts.
- Lower Value: Results in a more diffuse, softer glow that can appear blocky or less defined. Faster rendering. Often mapped to user-facing "Glow Quality" settings.
- 5. Default Value: Varies by graphics preset. Common values might range from 7 (128px) to 9 (512px).
- 6. Recommended Value:
- Max Fidelity: Highest available value (e.g.,
9). - Balanced: Mid-range value (e.g.,
8). - Max Performance: Lower value (e.g.,
7).
- Max Fidelity: Highest available value (e.g.,
Setting: RenderGlowIterations
- Type:
S32(Integer) - 1. Function/Purpose: Determines the number of blur passes applied to the downscaled glow map. The implementation likely performs
RenderGlowIterations * 2actual passes (one horizontal, one vertical per iteration) for a separable blur. - 2. Code Usage/Implementation: Used in
renderGlowto control the loop limit for the blur passes applied to themGlowbuffers. - 3. Performance Impact:
- Higher Value: Directly increases GPU load, roughly linearly with the number of iterations (passes). Significant performance factor.
- Lower Value: Reduces GPU load proportionally.
- 4. Visual Impact:
- Higher Value: Creates a smoother, wider, more Gaussian-like blur.
- Lower Value: Results in a less smooth blur (potentially showing stepping artifacts if too low) and a narrower glow spread for a given
RenderGlowWidth.
- 5. Default Value: Often relatively low, perhaps
2or3(resulting in 4 or 6 passes). - 6. Recommended Value:
- Max Fidelity/Smoothness:
3or4. Diminishing returns beyond this. - Max Performance:
1or2. (Consider linking to quality presets).
- Max Fidelity/Smoothness:
Setting: RenderGlowWidth
- Type:
F32(Float) - 1. Function/Purpose: Controls the spatial extent or radius of the blur applied. Determines how far apart the samples are taken during each blur pass.
- 2. Code Usage/Implementation: Used in
renderGlowto calculate thedeltaoffset passed as a uniform (GLOW_DELTA) to the blur shader (glowV.glsl). The vertex shader uses this delta to calculate offset texture coordinates for sampling. May be scaled internally based onRenderGlowResolutionPow. - 3. Performance Impact: Negligible. Changing the uniform value has minimal GPU cost.
- 4. Visual Impact: Controls the visual "size" or "spread" of the glow halo.
- Higher Value: Wider, softer, more diffuse glow.
- Lower Value: Narrower, tighter glow (smoothness also depends on
RenderGlowIterations). Major artistic control.
- 5. Default Value: Typically around
1.0to2.0. - 6. Recommended Value: Subjective artistic choice. Adjust to achieve the desired look (e.g.,
0.8for tight halos,2.5+for wide haze).
Setting: RenderGlowStrength
- Type:
F32(Float) - 1. Function/Purpose: Acts as a final intensity multiplier for the blurred glow map before it is composited back onto the main scene image.
- 2. Code Usage/Implementation: Used in
renderGlow(or potentially later in the glow combine stage). Passed as a uniform (GLOW_STRENGTH) to the blur shader or used in the final compositing step to scale the brightness of the added glow. - 3. Performance Impact: Negligible. Changing the multiplier value has minimal cost.
- 4. Visual Impact: Directly controls the overall brightness or prominence of the glow effect. Higher values make the glow more intense and impactful; lower values make it subtler. Major artistic control.
- 5. Default Value: Likely around
1.0to1.5. - 6. Recommended Value: Subjective artistic choice. Start near
1.0and adjust to taste. Values0.5-3.0+are common depending on desired intensity.
Setting: RenderGlowMinLuminance (Restored Functionality - Operates Post-Tonemapping)
- Type:
F32(Float) - 1. Function/Purpose: Defines the minimum brightness threshold a pixel in the tonemapped source image (
mPostMap) must exceed to contribute to the initial glow extraction (before blurring). Controls what glows based on perceived brightness after tonemapping. - 2. Code Usage/Implementation:
- The setting variable
LLPipeline::RenderGlowMinLuminancemust be declared, connected (connectRefreshCachedSettingsSafe), and read (refreshCachedSettings). - In the glow extraction phase within
renderGlow(or equivalent), the hardcoded9999must be replaced with code passing this variable to theGLOW_MIN_LUMINANCEuniform forgGlowExtractProgram:gGlowExtractProgram.uniform1f(LLShaderMgr::GLOW_MIN_LUMINANCE, llmax(0.f, RenderGlowMinLuminance));. - The shader (
glowExtractF.glsl) uses this value insmoothstepfunctions to determine the contribution based on calculated luminance/warmth of the tonemapped input pixel.
- The setting variable
- 3. Performance Impact: Negligible. Restoring the use of the setting variable instead of a hardcoded value has no significant performance cost.
- 4. Visual Impact: Controls the selectivity of the glow effect based on post-tonemapping brightness.
- Higher Value (e.g., 0.9, 0.95): Only the very brightest pixels (after tonemapping) will contribute, resulting in glow mainly on extreme highlights.
- Lower Value (e.g., 0.7, 0.6): Moderately bright pixels (after tonemapping) will also contribute, leading to a more widespread glow.
- Crucial: Values useful for the previous linear-space implementation (e.g., > 1.0) are likely too high now. The effective range is roughly 0.6 to 1.0.
- 5. Default Value: Needs Adjustment! The original default value (likely intended for linear space) is inappropriate. A new default suitable for post-tonemapped input should be set in the settings XML file. A starting point of
0.80or0.85is recommended, requiring testing and refinement. - 6. Recommended Value: Highly dependent on desired artistic effect. Users should experiment within the ~0.6 to 1.0 range.
- Highlight Glow:
0.85-0.95. - Wider Hazy Glow:
0.6-0.8.
- Highlight Glow:
Setting: RenderGlowNoise
- Type:
Boolean - 1. Function/Purpose: Enables adding a small amount of noise (dithering) during the glow extraction phase.
- 2. Code Usage/Implementation: If
true, the glow extraction logic binds a noise texture (mTrueNoiseMap) and enables noise calculations (controlled byHAS_NOISEpreprocessor flag) in the extraction shader (glowExtractF.glsl). Requires shader state change if toggled. - 3. Performance Impact: Very minor GPU cost (extra texture lookup and arithmetic in the extraction shader).
- 4. Visual Impact:
- Enabled (
true): Reduces or eliminates visible banding artifacts in the glow, especially noticeable in smooth gradients when using lower precision buffers (RenderGlowHDR=false). Adds a very subtle noise pattern. - Disabled (
false): May result in visible banding artifacts under certain conditions.
- Enabled (
- 5. Default Value: Likely
true. - 6. Recommended Value:
- Max Fidelity:
true. - Max Performance:
false. (Generally recommended to leavetrueunless profiling shows an unexpected impact). Consider linking to quality presets.
- Max Fidelity:
Setting: RenderGlowMaxExtractAlpha
- Type:
F32(Float) - 1. Function/Purpose: Acts as a multiplier or ceiling applied to the calculated glow contribution before it's written to the extraction buffer (
mGlow[2]). - 2. Code Usage/Implementation: Passed as
GLOW_MAX_EXTRACT_ALPHAuniform toglowExtractF.glsl. Used in the shader:frag_color.a = max(col.a, mix(lum, warmth, warmthAmount) * maxExtractAlpha);. Scales the luminance/warmth derived value. - 3. Performance Impact: Negligible.
- 4. Visual Impact: Limits the intensity extracted from any single pixel before blurring. Can tame excessively bright spikes at the source. Lower values dim the source; higher values allow brighter sources (up to buffer limits). Effect can be subtle compared to final
RenderGlowStrength. - 5. Default Value: Likely
1.0. - 6. Recommended Value: Generally
1.0. Can be considered an advanced/fine-tuning setting. Not essential for most users. Could potentially be hidden from basic UI.
Setting: RenderGlowWarmthAmount
- Type:
F32(Float) - 1. Function/Purpose: Blends between using standard luminance (
lumWeights) and an alternative "warmth" metric (warmthWeights) when calculating the initial glow extraction contribution. - 2. Code Usage/Implementation: Passed as
GLOW_WARMTH_AMOUNTuniform toglowExtractF.glsl. Used inmix(lum, warmth, warmthAmount). - 3. Performance Impact: Negligible.
- 4. Visual Impact: If > 0, allows biasing the glow source towards colors emphasized by
RenderGlowWarmthWeights.0.0uses standard luminance only;1.0uses warmth metric only. Can provide subtle color tinting at the source of the glow. Effect depends heavily onWarmthWeightsand is considered niche. - 5. Default Value: Likely
0.0. - 6. Recommended Value:
0.0for standard behavior. Experimentation needed for artistic effect. Could potentially be simplified or replaced by a more intuitive post-blur tint control.
Setting: RenderGlowWarmthWeights
- Type:
LLVector3(Vector of 3 Floats) - 1. Function/Purpose: Defines the RGB weights used in the alternative "warmth" calculation, used only if
RenderGlowWarmthAmount > 0. - 2. Code Usage/Implementation: Passed as
GLOW_WARMTH_WEIGHTSuniform toglowExtractF.glsl. Used inmax(col.r * warmthWeights.r, max(col.g * warmthWeights.g, col.b * warmthWeights.b)). - 3. Performance Impact: Negligible.
- 4. Visual Impact: Influences which colors contribute to the "warmth" component if
WarmthAmount> 0. Highly technical control for a niche effect. - 5. Default Value: Unknown, could be
(1,1,1)or biased. - 6. Recommended Value: Keep at default unless specifically using
WarmthAmountfor artistic effect. Candidate for simplification/removal from user settings.
Setting: RenderGlowLumWeights
- Type:
LLVector3(Vector of 3 Floats) - 1. Function/Purpose: Defines the RGB weights used to calculate standard perceived luminance during glow extraction.
- 2. Code Usage/Implementation: Passed as
GLOW_LUM_WEIGHTSuniform toglowExtractF.glsl. Used indot(col.rgb, lumWeights). - 3. Performance Impact: Negligible.
- 4. Visual Impact: Determines relative contribution of RGB to brightness for glow. Changing from standard perceptual weights yields non-standard results.
- 5. Default Value: Standard perceptual luminance weights (e.g., close to Rec.709:
(0.2126, 0.7152, 0.0722)or NTSC:(0.299, 0.587, 0.114)). - 6. Recommended Value: Should not be a user setting. This should be fixed internally to a standard perceptual value. Recommend removing this from debug settings/XML definitions intended for users.
3. Testing Procedures
3.1 User Testing
Objective: To visually assess the impact of Glow settings on appearance and perceive performance changes.
Prerequisites:
- Second Life Viewer running with Advanced Lighting Model (ALM) enabled.
- Access to the Graphics Preferences panel or Debug Settings.
- FPS counter visible (
Ctrl+Shift+1).
Location: Find a location with a mix of elements: bright lights, emissive objects, dark backgrounds, potentially smooth gradients.
Steps:
- Baseline: Set graphics to High or Ultra. Note visuals and FPS. Ensure
RenderGlowistrue. - Master Toggle (
RenderGlow): Disable/EnableRenderGlow. Observe bloom disappearance/appearance and FPS change. - Quality (
RenderGlowResolutionPow): Test low (e.g., 7) vs. high (e.g., 9). Observe glow definition/smoothness/blockiness and FPS impact. - Iterations (
RenderGlowIterations): Test low (e.g., 1-2) vs. high (e.g., 4). Observe glow smoothness/spread and FPS impact. - Artistic Controls (
RenderGlowStrength,RenderGlowWidth): AdjustStrength(intensity) andWidth(spread/size). Observe how they interact to control the glow's look. - Threshold (
RenderGlowMinLuminance):- Crucial: Test values primarily in the
0.6to1.0range. - Set to a low value (e.g.,
0.6). Observe which moderately bright areas start glowing. - Set to a high value (e.g.,
0.95). Observe that only the very brightest highlights contribute to the glow. Find a value that feels like a good balance.
- Crucial: Test values primarily in the
- Quality Artifacts (
RenderGlowHDR,RenderGlowNoise): Find a large, smooth glow area. ToggleHDR– look for banding reduction/intensity changes. ToggleNoise– look for subtle dithering and banding reduction (especially withHDRoff). - (Optional) Niche Settings: If desired, test
RenderGlowMaxExtractAlpha(try extreme values like 0.5, 5.0). TestWarmthAmount(set > 0) and see if changingWarmthWeightssubtly tints the glow source.
3.2 Developer Testing
Objective: To measure performance impact, verify functionality (especially the restored MinLuminance), and inspect intermediate steps.
Prerequisites:
- Development environment, Debug build.
- GPU Profiling/Debugging Tools (RenderDoc, Nsight, RGP, etc.).
- System VRAM monitoring.
Steps:
- Performance Profiling (GPU Time): Use a GPU profiler. Measure time spent in the
renderGlowfunction (or relevant GPU zones) while varying:RenderGlow(on/off).RenderGlowResolutionPow(e.g., 7, 8, 9).RenderGlowIterations(e.g., 1, 2, 4).- Verify other settings have negligible GPU time impact.
- VRAM Measurement: Track VRAM usage. Measure increase when
RenderGlowis enabled. Verify changes withRenderGlowResolutionPowandRenderGlowHDRmatch expected buffer sizes (Res*Res*BytesPerPixel*NumBuffers). - Shader/Buffer Inspection (Frame Debugging - e.g., RenderDoc):
- Capture a frame.
- Input Check: Verify the input to
gGlowExtractProgramismPostMap(tonemapped image). - MinLuminance Verification: Inspect the uniforms passed to
gGlowExtractProgram. ConfirmGLOW_MIN_LUMINANCEmatches the value set via theRenderGlowMinLuminancedebug setting (not9999). - Extraction Output (
mGlow[2]): Examine the content. Verify that changingRenderGlowMinLuminance(in the 0.6-1.0 range) correctly changes which areas appear bright in this buffer. Check for noise dithering ifRenderGlowNoiseis enabled. - Blur Passes (
mGlow[0],mGlow[1]): Step through blur iterations. Verify visual blurring and checkGLOW_DELTA,GLOW_STRENGTHuniforms. - Buffer Formats: Confirm
mGlowtexture formats matchRenderGlowHDR.
- Functionality/Stability: Change all restored/modified settings via Debug Settings. Check for log errors or crashes. Ensure the effect updates visually. Step through C++ code (
refreshCachedSettings,renderGlow) to confirm variable reading and uniform setting.
4. Summary and Recommendations
The Glow effect is a key component of the viewer's visual presentation. The available settings provide significant control over its performance and appearance.
- Key Functional Controls:
RenderGlow,RenderGlowResolutionPow,RenderGlowIterations,RenderGlowWidth,RenderGlowStrengthare essential and generally function as expected. - Restored Threshold:
RenderGlowMinLuminancefunctionality has been restored by linking the setting variable to the shader uniform, replacing the previous hardcoded disabling value (9999). Crucially, this threshold now operates on post-tonemapping values, requiring adjustment of the expected range (approx. 0.6-1.0) and the default value in settings XML. - Quality Enhancements:
RenderGlowHDRandRenderGlowNoiseare useful for reducing artifacts but could potentially be linked to overall quality presets for simplicity. - Simplification Candidates:
RenderGlowLumWeightsshould be removed as a user setting and hardcoded internally.RenderGlowWarmthAmount/Weightsprovide niche artistic control and could be simplified or replaced by a more common post-blur tint option.RenderGlowMaxExtractAlphacould be relegated to advanced/debug status.
With the restoration of a functional (post-tonemapping) RenderGlowMinLuminance threshold, users and developers regain vital control over what parts of the scene contribute to the glow, complementing the existing controls for how the glow looks and performs. Further simplification of niche settings could improve usability.