Asteroids sample demonstrates multi-threaded rendering of large number of random-generated asteroids with Methane Kit library using one of modern graphics APIs (DirectX 12, Vulkan or Metal) and platform independent implementation. Thousands of unique asteroid instances (1000-50000) are drawn with individual draw-call parameters in parallel with a random combination of:
- random-generated mesh (from array of up to 1000 unique meshes),
- random generated perlin-noise array texture each with 3 projections (from array of up to 50 unique textures),
- random combination of coloring (from 72 color combinations).
Methane Asteroids sample was inspired by Intel Asteroids D3D12, but implemented from scratch in a cross-platform style using Methane Kit.
Platform |
Graphics API |
Screenshot |
---|---|---|
Windows | DirectX 12 Vulkan |
|
Linux | Vulkan | |
MacOS | Vulkan Metal |
|
iOS, tvOS | Metal |
Default parameters of asteroids simulation are selected depending on CPU HW cores count and are displayed
in right-bottom panel (switched with F3
key).
Overall scene complexity can be reduced or increased by pressing [
/ ]
keys.
Sample renders galaxy background using Methane::Graphics::SkyBox
and planet using generated Methane::Graphics::SphereMesh
with spherical texture coordinates. It also uses interactive Arc-Ball camera
rotated with mouse LMB
and light rotated with RMB
with keyboard shortcuts also available (see in help by F1
key).
- Asteroid meshes use dynamically selected LODs depending on estimated screen size.
This allows to greatly reduce GPU overhead. Use
L
key to enable LODs coloring and'
/;
keys to increase / reduce overall mesh level of details. - Parallel rendering of asteroids array with individual draw-calls allows to be less CPU bound.
Multi-threading can be switched off for comparing with single-threaded rendering by pressing
P
key. - Parallel updating of asteroid transformation matrices in AsteroidsArray::Update and
encoding asteroid meshes rendering in MeshBuffers::DrawParallel
are implemented using Taskflow library which enables effective usage of the thread-pool via
parallel_for
primitive. - All asteroid textures are bound to program uniform all at once as an array of textures to minimize number of program binding calls between draws. Particular texture is selected on each draw call using index parameter in constants buffer. Note that each asteroid texture is a texture 2d array itself with 3 mip-mapped textures used for triplane projection.
- Inverted depth buffer (with values from 1 in foreground to 0 in background and greater-or-equal compare function) is used to minimize frame buffer overdrawing by rendering in order from foreground to background: asteroids array with planet are drawn first and sky-box afterwards.
Keyboard Action | Shortcut | Controller |
---|---|---|
APPLICATION SETTINGS | ||
Show controls help | F1 |
Platform::AppController |
Show command-line help | F2 |
Platform::AppController |
Show parameters | F3 |
Platform::AppController |
Switch heads-up-display mode | F4 |
UserInterface::AppController |
Switch full-screen | LCtrl + F |
Platform::AppController |
Close application | LCtrl /LCmd + Q |
Platform::AppController |
Switch animations on/off | LCtrl + P |
Graphics::AppController |
GRAPHICS CONTEXT SETTINGS | ||
Switch vertical synchronization | LCtrl + V |
Graphics::AppContextController |
Switch device used for rendering | LCtrl + X |
Graphics::AppContextController |
Add frame buffer to swap-chain | LCtrl + + |
Graphics::AppContextController |
Remove frame buffer from swap-chain | LCtrl + - |
Graphics::AppContextController |
VIEW CAMERA | ||
Move camera left | A |
Graphics::AppCameraController |
Move camera right | D |
Graphics::AppCameraController |
Move camera forward | W |
Graphics::AppCameraController |
Move camera backward | S |
Graphics::AppCameraController |
Move camera up | Page Up |
Graphics::AppCameraController |
Move camera down | Page Down |
Graphics::AppCameraController |
Yaw camera left | Left |
Graphics::AppCameraController |
Yaw camera right | Right |
Graphics::AppCameraController |
Pitch camera up | Up |
Graphics::AppCameraController |
Pitch camera down | Down |
Graphics::AppCameraController |
Roll camera left | < |
Graphics::AppCameraController |
Roll camera right | > |
Graphics::AppCameraController |
Zoom camera in | + |
Graphics::AppCameraController |
Zoom camera out | - |
Graphics::AppCameraController |
Change camera pivot | LAlt + P |
Graphics::AppCameraController |
Reset camera orientation | LAlt + R |
Graphics::AppCameraController |
LIGHT SOURCE | ||
Reset light orientation | LCtrl + L |
Graphics::AppCameraController |
ASTEROIDS SETTINGS | ||
Switch Parallel Rendering | P |
Samples::AsteroidsAppController |
Switch Mesh LODs Coloring | L |
Samples::AsteroidsAppController |
Increase Mesh LOD Complexity | ' |
Samples::AsteroidsAppController |
Decrease Mesh LOD Complexity | ; |
Samples::AsteroidsAppController |
Increase Scene Complexity | ] |
Samples::AsteroidsAppController |
Decrease Scene Complexity | [ |
Samples::AsteroidsAppController |
Set Scene Complexity 0 .. 9 | 0..9 |
Samples::AsteroidsAppController |
Mouse action | Mouse Button | Controller |
---|---|---|
VIEW CAMERA | ||
Rotate camera | Left Button | Graphics::AppCameraController |
Zoom camera | Ver. Scroll Wheel | Graphics::AppCameraController |
Move camera | Middle Button | Graphics::AppCameraController |
LIGHT SOURCE | ||
Rotate Light | Right Button | Graphics::AppCameraController |
Argument | Value (Default) | Description |
---|---|---|
APPLICATION SETTINGS | ||
-h , --help |
- | Print help message and exit |
-w , --wnd-size |
W H (0.8 0.8 ) |
Window size in pixels or as ratio of desktop size |
-f , --full-screen |
0 / 1 (0 ) |
Full-screen mode |
-a , --animations |
0 / 1 (1 ) |
Enable animations |
-d , --device |
-1 / 0..N (0 ) |
Render at adapter index, use -1 for software adapter |
-v , --vsync |
0 / 1 |
Vertical synchronization |
-b , --frame-buffers |
0..N (3 ) |
Frame buffers count in swap-chain |
-i , --hud |
0..2 (2 ) |
HUD display mode (0 - hidden, 1 - in window title, 2 - in UI) |
ASTEROIDS SETTINGS | ||
-c , --complexity |
0..9 |
Asteroids simulation complexity |
-s , --subdiv-count |
1..N |
Mesh subdivisions count |
-t , --texture-array |
0 / 1 (0 ) |
Texture array enabled |
-r , --parallel-render |
0 / 1 (1 ) |
Parallel rendering enabled |
Integrated instrumentation of the Methane Kit library and Asteroids sample enables profiling with the following tools:
Tracy Frame Profiler | Intel Graphics Trace Analyzer |
---|---|
Methane Asteroids sample along with Methane Kit are distributed under Apache 2.0 License: it is free to use and open for contributions!