Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion configs/launch_manifest/omnidreams_local_window.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@ runner: omnidreams-perf
mode: local-window

scenario:
auto_start: false
auto_start: true
game_mode: true
preload_scenes: false

output:
world_model_manifest_path: ../../integrations/omnidreams/omnidreams/interactive_drive/configs/example_world_model_perf.yaml
ludus_backend: vulkan
12 changes: 12 additions & 0 deletions configs/launch_manifest/omnidreams_local_window_vulkan.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
schema_version: 1
runner: omnidreams-perf
mode: local-window

scenario:
auto_start: true
game_mode: true
preload_scenes: false

output:
world_model_manifest_path: ../../integrations/omnidreams/omnidreams/interactive_drive/configs/example_world_model_perf.yaml
ludus_backend: vulkan
36 changes: 32 additions & 4 deletions integrations/omnidreams/ludus-renderer/README.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
# Ludus Renderer

GPU-native F-theta renderer and PhysX-first object graph for autonomous
vehicle simulation. Rendering is CUDA-only and is built on the HPG 2011
CudaRaster triangle pipeline.
vehicle simulation. The default CUDA backend uses the HPG 2011 CudaRaster
triangle pipeline; an optional Windows/Linux Vulkan backend uses task, mesh,
and fragment shaders to rasterize into native device-local attachments, then a
compute export pass writes a CUDA-visible linear buffer.

## Features

- **F-theta Camera Model**: Native support for fisheye lens distortion using polynomial projection
- **One CUDA rendering path**: no graphics API interop or duplicate backend
- **CUDA and Vulkan rendering paths**: matching timestamped-scene APIs, with
Vulkan using device-local shared buffers and GPU timeline-semaphore ordering
- **PhysX object graph**: generic rigid bodies and invisible map barriers;
applications own semantic vehicle design and driving policy
- **Mutable simulation buffers**: actor add/update/remove operations preserve one
Expand All @@ -27,12 +30,21 @@ CudaRaster triangle pipeline.
## Requirements

**Always:**

- NVIDIA GPU (Turing or later)
- CUDA 11+
- Python 3.10+
- A C++17 compiler (Visual Studio 2022 on Windows)
- ffmpeg (for MP4 muxing with `--output-format mp4`)

**Vulkan backend (optional, Windows and Linux):**

- Vulkan 1.3 headers and loader (LunarG Vulkan SDK on Windows;
`libvulkan-dev` on Debian/Ubuntu)
- `VK_EXT_mesh_shader`, `VK_KHR_fragment_shader_barycentric`,
timeline semaphore, and platform-native external-memory/semaphore support on
the CUDA-paired Vulkan device (`*_win32` on Windows, `*_fd` on Linux)

## Installation

```bash
Expand All @@ -57,13 +69,29 @@ uv run --package ludus-renderer python -c "from ludus_renderer import prepare_ph

## Usage

The CUDA renderer is the only public rendering backend:
CUDA remains the default backend:

```python
from ludus_renderer import LudusCudaTimestampedContext
ctx = LudusCudaTimestampedContext(device="cuda")
```

The Vulkan backend mirrors the timestamped context API. Fixed-function color
and depth attachments resolve primitive/depth ordering in the native raster
pipeline. A separate compute dispatch then packs the resolved image into
row-major RGBA8 in a reusable exported linear SSBO. PyTorch wraps CUDA's mapping
of that buffer, so only the post-raster handoff is zero-copy; the native image
is never treated as tensor storage. Timeline semaphores and external
queue-family ownership barriers order the work without a steady-state CPU wait.
Attachments are cached per resolution; the current path is single-sample.
Platform-native OS handles are transient and closed or transferred immediately
after CUDA imports them.

```python
from ludus_renderer import LudusVulkanTimestampedContext
ctx = LudusVulkanTimestampedContext(device="cuda")
```

`PhysXWorld` consumes `PhysicsObjectGraph` and creates `PxScene`, rigid actors,
materials, and shapes directly, without an intermediate scene-format runtime.
The first PhysX use in each process asks CMake to configure and build the pinned
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@
FThetaCamera,
# Contexts
LudusCudaTimestampedContext,
LudusTimestampedContext,
LudusVulkanTimestampedContext,
ObstaclePool,
Polygon,
# Primitives
Expand Down Expand Up @@ -125,6 +127,8 @@
"mirror_augment_scene",
# Rendering contexts
"LudusCudaTimestampedContext",
"LudusTimestampedContext",
"LudusVulkanTimestampedContext",
"MutableObjectSceneBuffer",
# Primitives
"Polyline",
Expand Down
Loading
Loading