Linearly Transformed Cosines (LTCs) are a family of distributions that are used for real-time area-light shading thanks to their analytic integration properties. Modern game engines use an LTC approximation of the ubiquitous GGX model, but currently this approximation only exists for isotropic GGX and thus anisotropic GGX is not supported. While the higher dimensionality presents a challenge in itself, we show that several additional problems arise when fitting, post-processing, storing, and interpolating LTCs in the anisotropic case. Each of these operations must be done carefully to avoid rendering artifacts. We find robust solutions for each operation by introducing and exploiting invariance properties of LTCs. As a result, we obtain a small 84 look-up table that provides a plausible and artifact-free LTC approximation to anisotropic GGX and brings it to real-time area-light shading.
Look up tables (LUTs)
Below you can find 8x8x8x8 look up tables for two different parameterizations.
|Parameterization||Numpy||C++ float array|
|αx , αy , θ , φ||LUT.npy||LUT.cpp|
|α , λ , θ , φ||LUT.npy||LUT.cpp|
Storing LUTs in a texture
Use with hardware and software interpolation. Three sets of 8x8x64 textures.
Fetching LTC matrices
Pseudocode for fetching LTC matrices for both LUT parameterizations is given below.
Parameterization: αx , αy , θ , φ
Parameterization: α , λ , θ , φ
Thanks to Thomas Deliot for making a prototype in the Unity engine and to Stephen Hill for his feedback.
Aakash KT was funded by the "Kohli Fellowhip" of KCIS.