- explains gamut mapping techniques
- difference perceptual and clipping techniques
- shows how gamut mappings are derived
![fs2_gamut_ab_view.png](https://www.jendrikillner.com/img/posts/graphics-programming-weekly-90/fs2_gamut_ab_view.png&key=4fadf926113e7a5239c713cce9ecc56e665b72d1317dfaf846d970825f933308)
- shows how the fog in The Witcher 3 has been implemented
- combines aerial fog and an artist-controlled fog coloring based on a gradient from 3 colors (front to back)
- uses AO information to darken the fog in occluded areas
![01_scene.jpg](https://www.jendrikillner.com/img/posts/graphics-programming-weekly-90/01_scene.jpg&key=645c827ad1952e0988b7ef29789a8135d0b3943ab9bc4b49a2c9c8bf8d4a610e)
- list of sessions from SIGGRAPH 2019 that are related to ray tracing techniques
![SIGGRAPH2019.png](https://www.jendrikillner.com/img/posts/graphics-programming-weekly-90/SIGGRAPH2019.png&key=87c266eba3bd702a256ec0de48a262c8db47cb3cf9f221558531619698541a70)
- new extensions in AMD driver
- VK_EXT_full_screen_exclusive, allows application to enter fullscreen mode such as IDXGISwapChain::SetFullscreenState
- VK_EXT_separate_stencil_usage allows separate depth and stencil states
- VK_AMD_display_native_hdr, better HDR support for FreeSync 2 monitors without requiring AMD libraries
![amd_vulkan.jpg](https://www.jendrikillner.com/img/posts/graphics-programming-weekly-90/amd_vulkan.jpg&key=1f52498de192f16a9bb8a9ce72b90d66a31ba31108675885e49d2115b3862d56)
- support for GPU timing data in the new timing capture view
- a lot of GPU capture improvements
![NewTimingCapturesWithGpuData2.png](https://www.jendrikillner.com/img/posts/graphics-programming-weekly-90/NewTimingCapturesWithGpuData2.png&key=762b3b42e62fa975c4e3f4300400720469c594327f02724d02e6890a6231b8b7)
- new glint integrator for specular surfaces using multiple-scattering patch-based BRDF
- addresses energy loss introduced from classical normal mapping
- uses normal maps and second moments of slopes as in LEADR mapping
![teaser_EGSR_2019.png](https://www.jendrikillner.com/img/posts/graphics-programming-weekly-90/teaser_EGSR_2019.png&key=d37106778e74f942f8c1a10d1c070abc65d60cc624e0bd8bfb6020483239a16f)
- shows a new version of voxel-based path-tracing based graphics engine
- provides an overview of the implementation
![voxel_path_tracing.png](https://www.jendrikillner.com/img/posts/graphics-programming-weekly-90/voxel_path_tracing.png&key=cf0be133cf2dd193a49c24aee007406db550fd471c6510b637dbf056c4a58180)
- new path tracing sampler techniques
- distributed per-pixel samples so that errors are distributed as blue noise in screen space
- provides C++ source code
- comparison against other methods at various sample counts
![blue_noise_screen_space.png](https://www.jendrikillner.com/img/posts/graphics-programming-weekly-90/blue_noise_screen_space.png&key=ffc40d285883a20139e880ec6dfa4d7e97b6cac2bdac56fa518f71f001171b90)
- the paper builds on the techniques described in the previous article
- introduces a temporal algorithm that locally permutes the pixel sequences
- improves error distribution for a series of frames
![blue_noise_temporal.png](https://www.jendrikillner.com/img/posts/graphics-programming-weekly-90/blue_noise_temporal.png&key=7f5704378f123a793f266712f8073b940d06ccce8916f89b80c4bbd5fbca90ad)
- describes how to support unbounded arrays of textures in Vulkan
- presents two techniques to solve validation errors
- first fills unused slots with a know valid texture descriptor
- second shows the required extensions to enable partially filled descriptor sets
![vulkan.png](https://www.jendrikillner.com/img/posts/graphics-programming-weekly-90/vulkan.png&key=911e01688c3b58dc7e8a0117f35d330098bfb1e2cea7ec230562abd267b0fb7d)
- shows how to implement raytracing against a Signed Distance Field (SDF)
- extends this to use sphere tracing
![ClippedSphere.png](https://www.jendrikillner.com/img/posts/graphics-programming-weekly-90/ClippedSphere.png&key=a14fc1223870ae398f8af29298d546ec8f63d6f9b517c504cb79e3537792bccc)
- a master thesis that describes a progressively path-traced solution for indirect illumination lightmaps on the GPU
- covers parameterizing geometry into lightmaps, improving coherence in a path tracer, reducing variance and spherical basis functions
- presents a new way to store diffuse and specular irradiance using an Ambient Dice encoding scheme (additional post below)
![master_thesis_illumination.png](https://www.jendrikillner.com/img/posts/graphics-programming-weekly-90/master_thesis_illumination.png&key=4c19cc9f4a3a68e8fc54aeb8f117489e9dc53d329ac182a5100ad724255fc9f5)
- explains how to extend the Ambient Dice basis function to store and evaluate both diffuse and specular irradiance
![Sponza-Metals-Metallic-SG12NN-Crop.jpg](https://www.jendrikillner.com/img/posts/graphics-programming-weekly-90/Sponza-Metals-Metallic-SG12NN-Crop.jpg&key=2809fcd58fd33327b28f300f95a238fb88afd7fdaca31f020d1c1a4c78ce169a)
- explains how branching on GPUs is commonly implemented
- explains what divergence is, impact on performance and how to reduce it
- GPUs use an execution mask to hide results from inactive threads
- shows how this looks in GCN ISA and AVX512
![gpu_branch_sorted.png](https://www.jendrikillner.com/img/posts/graphics-programming-weekly-90/gpu_branch_sorted.png&key=7ca82316a7ae43135ea17766a63175029afb806be1a5d6e26d82fe6101ca2826)
- describes the surface gradient framework
- a framework for robust processing of height maps, height volumes, and normal maps
- explains the Preliminaries (Tangent Frame, Height Maps, and Volumes, Wrinkled Surfaces)
![tbn.png](https://www.jendrikillner.com/img/posts/graphics-programming-weekly-90/tbn.png&key=3bfe84f5db758e5c4a73d89cae5567ab78ccafbd8315a07f176231332bdf03f6)
Thanks to Jon Greenberg for support of this series.
Would you like to see your name here too? Become a Patreon of this series.