/MethaneAsteroids

:ringed_planet: Asteroids sample demonstrating multi-threaded rendering of large number random-generated asteroids with Methane Kit framework using DirectX 12, Vulkan and Metal

Primary LanguageC++Apache License 2.0Apache-2.0

Methane Asteroids Sample

Gitpod Ready-to-Code CI Build

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.

Open in Gitpod

Platform  
Graphics API
Screenshot                                            
Windows DirectX 12

Vulkan
Asteroids on Windows
Linux Vulkan Asteroids on Linux
MacOS Vulkan

Metal
Asteroids on MacOS
iOS, tvOS Metal Asteroids on iOS

Features

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).

Rendering Optimizations

  • 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.

Controls

Keyboard actions

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 actions

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

Command line

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

Instrumentation and Profiling

Integrated instrumentation of the Methane Kit library and Asteroids sample enables profiling with the following tools:

Tracy Frame Profiler Intel Graphics Trace Analyzer
Asteroids Trace in Tracy Asteroids Trace in GPA Trace Analyzer

License

Methane Asteroids sample along with Methane Kit are distributed under Apache 2.0 License: it is free to use and open for contributions!

Copyright 2019-2022 © Evgeny Gorodetskiy Follow