Vulkan Samples
This repository holds many samples, showing various aspect of Vulkan, debugging tips and usage of other Nvidia tools. It has a dependency on nvpro_core for some core Vulkan helper classes and other small utilities. All projects are using GLFW and Dear ImGui
Each sample have its own documentation written in Markdown describing what was done and where to get more information.
Build
Easy Method (Windows)
Clone this repository
git clone https://github.com/nvpro-samples/vk_mini_samples.git
- Deploy.bat : pull and update all dependencies.
- Build.bat : build all projects in release and optionally to debug.
- Install.bat : copy the binaries and dlls to the
_install
directory.
Hand Made
git clone --recursive --shallow-submodules https://github.com/nvpro-samples/nvpro_core.git
git clone https://github.com/nvpro-samples/vk_mini_samples.git
Generate solution
cd vk_mini_samples
mkdir build
cd build
cmake ..
Note: If there are missing dependencies in nvpro_core
, run the following command in nvpro_core directory.
git submodule update --init --recursive --checkout --force
HLSL or SLANG
The samples can use two other shading languages besides GLSL, HLSL and SLANG. To switch between them, select one of option: USE_HLSL or USE_SLANG. Then regenerate CMake and the solution will be updated with compatible projects and their shaders.
Extra SDK
Some samples depend on other SDKs. They are only required if you intend to build these projects.
- OptiX 7.3+ : OptiX denoiser
- Cuda 10.x : OptiX denoiser
- Nsight Aftermath : Aftermath
Samples
Application Class
The examples uses many helper from nvpro_core: https://github.com/nvpro-samples/nvpro_core repository. The core of each sample uses the Application class to create a window, initialize the UI, and create a swapchain with the ImGui framework. The Application
class is a modified version of the Dear ImGui Vulkan example.
Samples are attached to the Application
class as Engines
. While the application is running, the sample will be called to render its UI or to perform rendering operations in the current frame.
Init
The init()
function will create the Vulkan context using nvvk::Context
, create the GLFW window and create the swapchains by calling ImGui_ImplVulkanH_CreateOrResizeWindow
.
Run
The run()
function is an infinite loop until the close event is triggered. Within the loop, each engine will be called with:
- onResize : Called when the viewport size is changing
- onUIRender : Called for anything related to UI
- onRender : For anything to render within a frame, with the command buffer of the frame.
- onUIMenu : To add functions to the menubar
At the end of each loop the frame is rendered with frameRender()
then the frame is presented with framePresent()
.
Samples
If you are new to this repository, the first samples to read to better understand the framwork are solid color and rectangle.
Name | Description | Image | HLSL | Slang |
---|---|---|---|---|
solid_color | Set a user custom color to a pixel wide texture and display it. | [x] | [x] | |
rectangle | Render a 2D rectangle to GBuffer. | [x] | [x] | |
aftermath | Integrate the Nsight Aftermath SDK to an existing application | [x] | [ ] | |
image_ktx | Display KTX image and apply tonemap post processing | [x] | [x] | |
image_viewer | Load an image, allow to zoom and pan under mouse cursor | [x] | [x] | |
mm_displacement | Micro-mesh displacement | [x] | [x] | |
mm_opacity | Micromap opacity | [x] | [x] | |
msaa | Hardware Multi-Sampling Anti-Aliasing | [x] | [x] | |
shader_printf | Add printf to shader and display in a log window | [x] | [x] | |
ray_trace | Simple ray tracer using metalic-roughness shading, reflection and shadows and simple sky shader. | [x] | [x] | |
shading execution reorder | Known also as SER, this shows how to reorder execution rays to gain a better usage of the GPU. | [x] | [x] | |
simple_polygons | Rasterizing multiple polygonal objects. | [x] | [x] | |
offscreen | Render without window context and save image to disk. | [x] | [x] | |
tiny_shader_toy | Compile shader on the fly, diplay compilation errors, multiple pipeline stages. | [ ] | [ ] | |
barycentric_wireframe | Draw wifreframe in a a single pass using gl_BaryCoordNV |
[ ] | [x] | |
texture 3d | Create a 3D texture and do ray marching. | [x] | [x] | |
position fetch | Using VK_KHR_ray_tracing_position_fetch. | [ ] | [ ] | |
ray_query | Doing inline raytracing in a compute shader | [x] | [ ] | |
ray_query_position_fetch | Using VK_KHR_ray_tracing_position_fetch in ray quary | [ ] | [ ] | |
shader_object | Using shader object and dynamic pipline | [x] | [x] | |
compute_only | Simple compute and display example | [x] | [x] |
HLSL
The two main shading languages that are used with Vulkan are:
- GLSL (OpenGL Shading Language)
- HLSL (High Level Shading Language)
Both GLSL and HLSL are supported by the samples. To switch between then, open CMake and under USE, toggle the USE_HLSL.
Note: it is also possible to use a different dxc
binary. By default, it uses the one coming with the Vulkan SDK, but there is the option to use the one of your choice. Open Vulkan
and change the path to Vulkan_dxc_EXECUTABLE
. If you do not see Vulkan
, make sure the Advanced
option is selected.
Note: To compile all samples with dxc, the Preview Release for June 2023 is needed.
Feature | GLSL | HLSL |
---|---|---|
Ease of use | Easier to learn | More difficult to learn |
Feature set | Less powerful | More powerful |
Support | More widely supported | Less widely supported |
Resources:
- HLSL to SPIR-V Feature Mapping Manual
- HLSL Ray Tracing
- HLSL to SPIR-V Feature Mapping
- Porting GLSL variables to HLSL
- Porting GLSL types to HLSL
- Porting GLSL pre-defined global variables to HLSL
- Mapping between HLSL and GLSL
Spir-V intrinsics
Releases:
Slang
Some samples have also been converted to use Slang. When configurating CMake, it should download automatically one of the release. To change the version of the Slang compiler, select the path to SLANG_EXE
in CMake.
To use Slang, check USE_SLANG then re-configure and re-generate.
Resources
- Github: https://github.com/shader-slang/slang
- Releases: https://github.com/shader-slang/slang/releases
- Getting Started: https://shader-slang.com/getting-started.html
- User Guide: http://shader-slang.com/slang/user-guide/index.html
- Various Documentations: https://github.com/shader-slang/slang/tree/master/docs
LICENSE
Copyright 2023 NVIDIA CORPORATION. Released under Apache License, Version 2.0. See "LICENSE" file for details.