Disable RTX scene ambient in Arena env config#734
Conversation
The carb setting /rtx/sceneDb/ambientLightIntensity defaults to 1.0 with color [0.1, 0.1, 0.1] in the IsaacLab kit experience. This adds a hidden ~10%-gray ambient floor to every rendered frame, completely independent of any USD UsdLuxLight prim — so policy cameras see lit scenes even when all USD lights are zeroed. The leak silently confounds vision-policy evals: a "low intensity" sweep on the dome light shows no change in scene brightness until the dome exceeds the renderer's ambient term. Override the carb on every Arena eval via RenderCfg.carb_settings, so USD lights are the sole source of illumination. Envs that previously relied on the ambient floor should add an explicit DomeLight asset. Signed-off-by: Clemens Volk <cvolk@nvidia.com>
There was a problem hiding this comment.
Code Review Summary
Overall Assessment: ✅ Approve with minor suggestions
This PR addresses a significant and subtle rendering issue that can silently confound vision-policy evaluations. The fix is well-targeted and correctly implemented.
🔍 Analysis
Problem Identified:
The RTX renderer's default ambient lighting (/rtx/sceneDb/ambientLightIntensity=1.0 with color [0.1, 0.1, 0.1]) creates a ~10% gray ambient floor that is independent of USD light prims. This hidden illumination source makes it impossible to achieve true darkness in scenes, which breaks reproducibility in lighting sensitivity studies and domain randomization experiments.
Solution Approach:
Override both the intensity and color to zero via RenderCfg.carb_settings, making USD UsdLuxLight prims the sole source of illumination.
✅ Strengths
- Correct API usage: Uses the documented
RenderCfg.carb_settingsmechanism fromisaaclab.sim- this is the proper way to override Carbonite settings - Complete fix: Sets both
ambientLightIntensityto0.0ANDambientLightColorto[0.0, 0.0, 0.0]- belt-and-suspenders approach ensures no ambient contribution - Well-documented: The inline comment thoroughly explains why this change is needed, which is valuable for future maintainers
- Minimal scope: Changes only the base Arena environment config, affecting all Arena evaluations consistently
📝 Suggestions
-
Documentation consideration: The PR description mentions "Envs that previously relied on the ambient floor should add an explicit DomeLight asset." Consider whether this warrants a note in the Arena migration guide or changelog, since this is technically a behavior change for existing environments.
-
Migration note: If any internal Arena environments were implicitly depending on the ambient floor (expecting scenes to be visible without explicit lights), they may now render darker. The team should verify key benchmark environments still render as expected.
🔬 Technical Notes
- The carb settings path
/rtx/sceneDb/ambientLightIntensityis an RTX renderer internal that defaults at the kit experience level, not in USD - so this config-level override is the appropriate fix - Setting the color to black in addition to intensity=0 handles edge cases where color might be sampled even at zero intensity
Verdict: Ship it. This is a well-reasoned fix for a subtle but impactful rendering artifact that undermines scientific reproducibility in vision-policy research.
Greptile SummaryThis PR fixes a hidden RTX ambient lighting floor that persisted even when all USD light prims were removed or zeroed. The fix overrides two carb settings (
Confidence Score: 5/5Minimal-footprint change that writes two carb settings at config construction time; no logic changes, no regressions expected. The change correctly targets the two known RTX ambient settings with the right key paths and value types (float and list/color3), matching both the IsaacLab source implementation and the Omniverse RTX documentation. The fix is self-contained, the in-code comment documents intent clearly, and no subclasses in the repo reassign sim to a bare value that would drop these settings. No files require special attention. Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[IsaacLabArenaManagerBasedRLEnvCfg] --> B[SimulationCfg]
B --> C[RenderCfg with carb_settings]
C --> D[ambientLightIntensity set to 0.0]
C --> E[ambientLightColor set to black]
D --> F[RTX Renderer ambient disabled]
E --> F
F --> G[USD light prims are sole light source]
Reviews (2): Last reviewed commit: "Re-apply RTX scene ambient override afte..." | Re-trigger Greptile |
| render=RenderCfg( | ||
| carb_settings={ | ||
| "/rtx/sceneDb/ambientLightIntensity": 0.0, | ||
| "/rtx/sceneDb/ambientLightColor": [0.0, 0.0, 0.0], | ||
| }, | ||
| ), |
There was a problem hiding this comment.
Subclass
carb_settings override will silently discard the ambient fix
Any downstream @configclass that inherits from IsaacLabArenaManagerBasedRLEnvCfg and reassigns sim.render.carb_settings outright (e.g. sim = SimulationCfg(render=RenderCfg(carb_settings={"/rtx/translucency/enabled": False}))) will replace the dict entirely, losing the ambient zero. The @configclass system does not automatically merge nested dicts — the new assignment wins. Since the ambient suppression is a correctness concern for vision evals, it may be worth documenting this footgun (or enforcing it at env-build time rather than in the default config).
#733 moved IsaacLabArenaManagerBasedRLEnvCfg into a new module, isaaclab_arena_manager_based_env_cfg.py, and the merge into this branch dropped the RenderCfg carb override added in 2c1028c. Re-apply it at the config's new home so USD light prims remain the sole source of scene illumination. Signed-off-by: Clemens Volk <cvolk@nvidia.com>
| render=RenderCfg( | ||
| carb_settings={ | ||
| "/rtx/sceneDb/ambientLightIntensity": 0.0, | ||
| "/rtx/sceneDb/ambientLightColor": [0.0, 0.0, 0.0], |
There was a problem hiding this comment.
Minor comment: Is the ambientLightColor override necessary? Once intensity is set to 0.0 then the colour should not matter no?
Summary
Zeroing out all USD lights (or sweeping a dome light down to
light_intensity=0) still produced a lit scene in the policy cameras instead of black.Override the carb settings on every Arena eval via
RenderCfg.carb_settingson the defaultSimulationCfg.Detailed description