Bindings of NVIDIA's Optix Denoiser for node-vulkan. Allows to share VkBuffers between Vulkan and the Optix Denoiser for real-time denoising.
You need the latest NVIDIA driver, as this project uses Optix 7 which is fully integrated into the driver.
Also at the moment, you have to use the node-vulkan build from the repository as a possible bug in the Vulkan specification is currently blocking me to update the package.
npm install nvk-optix-denoiser
Name | Type | Description |
---|---|---|
width | Number | Width of the input to operate |
height | Number | Height of the input to operate |
Creates a new instance of the denoiser with the desired width and height.
Destroyes the denoiser and all imported memory buffers and semaphores.
Name | Type | Description |
---|---|---|
blendFactor | Number | Blending factor (0-1 range) of the input and the denoised output |
Name | Type | Description |
---|---|---|
color | BigInt | Importable Vulkan handle to the color channel |
albedo | BigInt | Importable Vulkan handle to the albedo channel |
normal | BigInt | Importable Vulkan handle to the normal channel |
- Color is the final image to denoise
- Albedo contains the primary hit albedo color
- Normal contains the primary hit normals of the scene in camera-space
let memoryGetWin32HandleInfoKHRInfo = new VkMemoryGetWin32HandleInfoKHR();
memoryGetWin32HandleInfoKHRInfo.memory = deviceMemory;
memoryGetWin32HandleInfoKHRInfo.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT;
let buffer = new ArrayBuffer(0x8);
result = vkGetMemoryWin32HandleKHR(device, memoryGetWin32HandleInfoKHRInfo, { $: buffer.getAddress() });
ASSERT_VK_RESULT(result);
let colorHandle = new BigUint64Array(buffer)[0];
...
..
denoiser.setVulkanInputMemory(
colorHandle,
albedoHandle,
normalHandle
);
Name | Type | Description |
---|---|---|
handle | BigInt | Importable Vulkan Semaphore |
Vulkan Semaphore which is used to wait for a finished render of a Vulkan ray-traced image, which then can be processed by the denoiser.
let semaphoreGetWin32HandleInfoKHRInfo = new VkSemaphoreGetWin32HandleInfoKHR();
semaphoreGetWin32HandleInfoKHRInfo.semaphore = denoiseWaitSemaphore;
semaphoreGetWin32HandleInfoKHRInfo.handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT;
let buffer = new ArrayBuffer(0x8);
result = vkGetSemaphoreWin32HandleKHR(device, semaphoreGetWin32HandleInfoKHRInfo, { $: buffer.getAddress() });
ASSERT_VK_RESULT(result);
let waitHandle = new BigUint64Array(buffer)[0];
denoiser.setWaitSemaphore(waitHandle);
Name | Type | Description |
---|---|---|
handle | BigInt | Importable Vulkan Semaphore |
Vulkan Semaphore which is used to indicate when the denoiser finished denoising, so Vulkan can (for example) display the denoised result.
let semaphoreGetWin32HandleInfoKHRInfo = new VkSemaphoreGetWin32HandleInfoKHR();
semaphoreGetWin32HandleInfoKHRInfo.semaphore = denoiseUpdateSemaphore;
semaphoreGetWin32HandleInfoKHRInfo.handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_OPAQUE_WIN32_BIT;
let buffer = new ArrayBuffer(0x8);
result = vkGetSemaphoreWin32HandleKHR(device, semaphoreGetWin32HandleInfoKHRInfo, { $: buffer.getAddress() });
ASSERT_VK_RESULT(result);
let updateHandle = new BigUint64Array(buffer)[0];
denoiser.setUpdateSemaphore(updateHandle);