Graphics

simvx.graphics is SimVX’s Vulkan renderer and window layer. App opens the window and runs the game loop; the renderer draws whatever nodes the scene holds.

To

Read

Open a window, set the frame rate, run headless

App

Draw 2D shapes, text and images from on_draw

2D drawing

Place and aim a 3D camera, cast rays from the mouse

Cameras (3D)

Colour, texture and blend 3D surfaces

Materials

Write your own GLSL

Custom shaders

Ship block-compressed textures

Compressed textures (BC / ASTC / ETC2)

Bring models and scenes in from Blender

Blender to SimVX (glTF)

Test what a frame looks like

Visual testing

Pick a windowing backend

Windowing backends

Set up bloom, fog, SSAO and the rest

WorldEnvironment

Run the game in a browser

Web export

Each rendering feature has a runnable example under examples/features/3d/; browse them in the Examples Gallery.

How the renderer works

The 3D renderer is GPU-driven: each frame, transforms, materials and lights go into flat NumPy arrays uploaded once, and one multi-draw-indirect call submits every visible opaque instance, so there is no per-object draw loop in Python. Transparent geometry is sorted and drawn in its own pass. Textures are bindless: a material refers to an image by index. Optional features (shadows, screen-space effects, post-processing) add no passes when they are off.

What it covers:

  • Lighting: directional, point and spot lights with cascaded and point shadows; image-based lighting, reflection probes and baked IrradianceVolume3D probe volumes.

  • Post-processing, set on WorldEnvironment: HDR with bloom and tonemapping, SSAO, SSR, SSGI, TAA, motion blur, volumetric fog, and render-scale upscaling. quality_tier scales them together.

  • Surfaces: PBR materials, Decal3D, WaterSurface3D, OceanSurface3D and PlanarReflection3D; a procedural sky with Rain3D and material wetness.

  • Culling: per-view frustum culling and Hi-Z GPU occlusion culling.

  • Offscreen views: SubViewport renders a subtree to a texture and RenderView captures the world through another Camera3D, for monitors and mirrors. Split-screen has no public API yet.

Buffer sizes, descriptor layouts and pass order are implementation details that change between builds; the source in simvx/graphics/renderer/ is the reference for them.

API reference

See simvx.graphics for the complete API.