Use when working with 3D-specific systems — materials, lighting, shadows, environment, global illumination, fog, LOD, occlusion culling, and decals in Godot 4.3+
All examples target Godot 4.3+ with no deprecated APIs. GDScript is shown first, then C#.
Related skills:player-controller for CharacterBody3D movement, physics-system for 3D collision shapes and raycasting, camera-system for Camera3D follow and transitions, shader-basics for spatial shaders and post-processing, godot-optimization for 3D performance tuning, animation-system for AnimationTree and 3D animation blending.
1. 3D Coordinate System & Core Nodes
Coordinate System
Godot uses a right-handed coordinate system with metric units (1 unit = 1 meter):
Axis
Direction
Color
X
Right
Red
Y
Up
Green
Z
Out of screen (+Z toward viewer)
Blue
Cameras and lights point along -Z by default. When a character "faces forward," they look along -Z.
Essential 3D Nodes
Node
Purpose
Node3D
Base transform node — position, rotation, scale
MeshInstance3D
Displays a mesh with a material
Camera3D
Required to render 3D — perspective or orthogonal
DirectionalLight3D
Sun/moon — parallel rays, cheapest light
OmniLight3D
Point light — emits in all directions
SpotLight3D
Cone light — flashlights, spotlights
WorldEnvironment
Sky, fog, tonemap, post-processing
Decal
Projected texture onto surfaces
GPUParticles3D
GPU-driven particle effects
CSGBox3D
etc.
Constructive Solid Geometry — prototyping
GridMap
3D tile-based level building
Godot 4.7+:
GridMap
exposes its internal octants for spatial queries (
cell_octant_size
,
get_used_octants()
,
get_octants_in_bounds()
and friends) so you can scope work to a region instead of walking every cell.
CSGShape3D
gains
autosmooth
/
smoothing_angle
for automatic face smoothing. Full method table and semantics: references/godot-4.7-additions.md
Prefer Alpha Scissor (fast, shadowed cutouts) or Alpha Hash (dithered — hair) over plain Alpha (slow, no shadows); Depth Pre-Pass suits mostly-opaque meshes with transparent edges.
See references/materials-and-lighting-recipes.md for the comparison table.
Setting Materials from Code & Material Instancing
Create a
StandardMaterial3D
at runtime, assign to
mesh.material_override
, and drive emissive flashes via Tween. Use
.duplicate()
to make per-instance copies so changing one mesh's material doesn't affect others.
See references/materials-and-lighting-recipes.md for the full GDScript and C# recipes (basic material setup, emissive flash, per-instance duplicate, dynamic OmniLight3D explosion).
3. Lighting
Light Types Comparison
Light
Shape
Shadows
Cost
Max Visible
DirectionalLight3D
Parallel rays
PSSM
Cheapest
8 (Forward+)
OmniLight3D
Sphere
Cube/Dual Paraboloid
Medium
512 clustered*
SpotLight3D
Cone
Single texture
Cheap
512 clustered*
AreaLight3D
(4.7+)
Rectangle
PCSS soft
Most expensive
—
*Forward+ shares 512 clustered element slots among omni lights, spot lights, decals, and reflection probes.
Light Properties
Key knobs:
light_color
,
light_energy
(HDR — values >1 are valid),
shadow_enabled
(big perf hit),
directional_shadow_mode
,
directional_shadow_max_distance
(lower = sharper shadows).
See references/materials-and-lighting-recipes.md for the properties table and the GDScript + C# sun setup snippet.
AreaLight3D (Godot 4.7+)
AreaLight3D
emits light from a rectangle along the node's -Z — neon tubes, screens, softbox panels — with PCSS soft shadows driven by
light_size
. Key properties:
area_size = Vector2(1, 1)
(meters),
area_range = 5.0
,
area_attenuation = 1.0
(
2.0
= physically accurate inverse square),
area_normalize_energy = true
(resizing keeps total output stable), optional
area_texture
for textured emission (Forward+/Mobile only). Mobile support is limited and Compatibility cannot cast area-light shadows; in Forward+, a single visible area light adds clustered-lighting cost to all rendered objects — reserve for cinematics or high-end targets.
See references/materials-and-lighting-recipes.md for the full property table and the GDScript + C# setup recipe.
Dynamic Point Light
Spawn an
OmniLight3D
at runtime, drive its energy with a tween, queue-free on completion. Common for explosions, muzzle flashes, magic effects.
See references/materials-and-lighting-recipes.md for the full GDScript and C# recipe.
Shadow Configuration & Bake Modes
Prefer
shadow_normal_bias
over
shadow_bias
against acne; keep
directional_shadow_max_distance
at the minimum needed (50–100 m typical). Bake modes: Disabled (fully real-time, default), Static (fully baked, no runtime cost), Dynamic (indirect baked, direct real-time).
See references/materials-and-lighting-recipes.md for the shadow-tuning table and the bake-modes table.
4. Environment & Post-Processing
Configure global rendering — sky background, tonemapping, glow, SSR, SSAO/SSIL/SDFGI, depth-of-field — through a
WorldEnvironment
node holding an
Environment
resource. Pick a tonemap (
Linear
,
Reinhard
,
Filmic
,
ACES
, or
AgX
) on the Environment resource. Forward+ enables SSAO, SSIL, SSR, and SDFGI; mobile/compatibility renderers omit these.
See references/environment-and-post.md for the full setup recipes (sky options, tonemap modes, all post-processing effects, the 4.6+ glow-before-tonemapping pipeline change, AgX
tonemap_white
/
tonemap_contrast
controls, and the 4.6+ SSR quality upgrade).
Godot 4.7+:
display/window/hdr/request_hdr_output
(default
false
, promoted to a basic project setting) requests HDR display output for the main window and editor where supported, auto-switching between HDR and SDR as screens or system settings change; it forces
Viewport.use_hdr_2d
on for the main viewport (other
SubViewport
s must enable it themselves). Read only at startup — toggle
Five GI options trade quality for cost: none (ambient only) → ReflectionProbe (localized) → LightmapGI (best quality, baked) → VoxelGI (small/medium dynamic) → SDFGI (large open-world). VoxelGI/SDFGI/LightmapGI require Forward+. The 4.5+ subsections below (Specular Occlusion, Bent Normal Maps) stay inline because they apply across GI methods.
See references/global-illumination.md for the methods comparison table, ReflectionProbe scene + code recipe, LightmapGI bake workflow, and SDFGI configuration.
Specular Occlusion from Ambient Light (Godot 4.5+)
Godot 4.5+ automatically computes specular occlusion from the ambient light probe when LightmapGI, VoxelGI, or SDFGI is active. Prevents unrealistically bright speculars in areas that receive little indirect light (under eaves, inside crevices, in corners). No API change — re-bake after upgrading to see the improvement on metallic / low-roughness surfaces. ReflectionProbe alone does not provide specular occlusion.
Bent Normal Maps (Godot 4.5+)
Bent normal maps encode the mean unoccluded direction from each texel — the average direction toward open sky across the hemisphere. When assigned to the Bent Normal slot on
StandardMaterial3D
, Godot uses this information to improve indirect lighting directionality and specular occlusion accuracy. The result is more realistic ambient lighting on complex surfaces like cloth, carved stone, or organic shapes.
Inspector setup: In
StandardMaterial3D
, enable Bent Normal → assign your tangent-space bent normal texture (baked from Marmoset, Substance, or xNormal).
Most visible on: materials that combine low roughness or high metallic values with baked GI (LightmapGI / VoxelGI / SDFGI). On fully rough dielectric surfaces the benefit is subtler. Use on hero assets; skip on background geometry.
See references/materials-and-lighting-recipes.md for the runtime-assignment GDScript + C# code path (the Inspector setup above is the typical case).
6. Fog
Three layers: depth/height fog set on
WorldEnvironment.environment
(cheap, all renderers), volumetric fog (Forward+ only — godrays through depth), and
FogVolume
nodes for localized fog effects (interior rooms, pits, atmospheric volumes).
See references/fog-recipes.md for the full GDScript and C# recipes — depth/height fog setup, volumetric fog parameters and performance notes, and FogVolume placement.
⚠️ Changed in Godot 4.7: Volumetric fog is now blended using transmittance instead of opacity, so existing volumetric fog can look different after upgrading. Enable the project setting
rendering/environment/fog/use_legacy_blending
(default
false
) to restore the previous behavior. See GH-119414.
7. Decals
Decal
nodes project a texture onto whatever surfaces fall within their bounding box — bullet holes, blood splatter, ground details, signage. All renderers support decals; performance scales with overdraw and decal count.
See references/decals.md for the scene setup, runtime spawning recipe (GDScript + C#), and the per-renderer decal limits.
8. Optimization — LOD, Culling, MultiMesh
Four tools: automatic mesh LOD (set on import or per
MeshInstance3D
), manual
VisibilityRange
for staged swaps, occlusion culling via
OccluderInstance3D
, and
MultiMeshInstance3D
for thousands of identical meshes in one draw call.
See references/lod-and-culling.md for setup recipes for each tool plus the MultiMesh runtime population example.
9. Renderer Comparison
Pick the renderer before you build the look: Forward+ (desktop default) is the only one with SDFGI and volumetric fog, Mobile trades those for performance on tile-based GPUs, and Compatibility (GLES3-class) drops most advanced lighting entirely. Advice that assumes SDFGI silently fails on the other two.
Full feature-by-renderer table and selection guidance: references/renderer-comparison.md
10. Common Pitfalls
Quick symptom → cause → fix table covering black scenes, dark objects without ambient light, shadow acne and peter-panning, popping shadows, flat materials, invisible decals, transparency sorting artifacts, SDFGI light leaking, missing volumetric fog, and invisible MultiMesh instances.
See references/common-pitfalls.md for the full table.
11. Implementation Checklist
Scene has Camera3D, at least one light source, and WorldEnvironment
Environment has a sky material (procedural or HDR panorama) for ambient and reflected light
Tonemap mode is set (Filmic or ACES for realistic look, AgX for physically accurate)