Download - Lightmap compression in Halo 3
![Page 1: Lightmap compression in Halo 3](https://reader036.vdocuments.us/reader036/viewer/2022062410/568163be550346895dd4db52/html5/thumbnails/1.jpg)
Lightmap compression in Halo 3
Yaohua HuBungie
![Page 2: Lightmap compression in Halo 3](https://reader036.vdocuments.us/reader036/viewer/2022062410/568163be550346895dd4db52/html5/thumbnails/2.jpg)
Halo 3’s light probe textures• Spherical harmonic coefficients• It is large
– Size: 1024x1024 (usually)– Each texel is a vector: 5*3 float values
![Page 3: Lightmap compression in Halo 3](https://reader036.vdocuments.us/reader036/viewer/2022062410/568163be550346895dd4db52/html5/thumbnails/3.jpg)
Halo3’s lightmap compression• Signal compression:
• Inter chart and sub chart optimization
• DXT compression:• Two DXT textures for each SH
coefficient channel
![Page 4: Lightmap compression in Halo 3](https://reader036.vdocuments.us/reader036/viewer/2022062410/568163be550346895dd4db52/html5/thumbnails/4.jpg)
Key idea 1/2 - Signal based optimization
• We optimize the sampling rate• Allocate less texels for low frequency area
![Page 5: Lightmap compression in Halo 3](https://reader036.vdocuments.us/reader036/viewer/2022062410/568163be550346895dd4db52/html5/thumbnails/5.jpg)
Initial result (2005)• Original signal: • Compressed to a
quarter size:
![Page 6: Lightmap compression in Halo 3](https://reader036.vdocuments.us/reader036/viewer/2022062410/568163be550346895dd4db52/html5/thumbnails/6.jpg)
Identifying the problem• The initial parameterization given by
artist may not be optimal• We want to reduce the texture size
automatically without very much visual quality degradation
• No overhead at run-time
![Page 7: Lightmap compression in Halo 3](https://reader036.vdocuments.us/reader036/viewer/2022062410/568163be550346895dd4db52/html5/thumbnails/7.jpg)
What we work with• Charts are our basic working
elements– 6018 charts in Zanzibar:
![Page 8: Lightmap compression in Halo 3](https://reader036.vdocuments.us/reader036/viewer/2022062410/568163be550346895dd4db52/html5/thumbnails/8.jpg)
Inter chart optimization• Resize the charts
based on their maximum gradient
• Pack them to another lightmap with a smaller size
![Page 9: Lightmap compression in Halo 3](https://reader036.vdocuments.us/reader036/viewer/2022062410/568163be550346895dd4db52/html5/thumbnails/9.jpg)
Signal analysis• Gradient in log space per channel per texel
– x =log( L_l * L_l ) - log( L_r * L_r )
– y =log( L_t * L_t ) - log( L_b * L_b )
• Analyze the maximum gradient per chart– add the gradients of all SH coefficients
per texel – The magnitude of the maximum gradient is the
relative resizing ratio
Texel [N]
L_b
L_l L_r
L_t
![Page 10: Lightmap compression in Halo 3](https://reader036.vdocuments.us/reader036/viewer/2022062410/568163be550346895dd4db52/html5/thumbnails/10.jpg)
Top: lightmap on ZanzibarBottom left: artist’s outputBottom right: optimized lightmap
![Page 11: Lightmap compression in Halo 3](https://reader036.vdocuments.us/reader036/viewer/2022062410/568163be550346895dd4db52/html5/thumbnails/11.jpg)
Top: lightmap on ZanzibarBottom left: artist’s outputBottom right: optimized lightmap
![Page 12: Lightmap compression in Halo 3](https://reader036.vdocuments.us/reader036/viewer/2022062410/568163be550346895dd4db52/html5/thumbnails/12.jpg)
Sub chart optimization• Inter charts optimization is not good
enough for big charts with only several high frequency triangles
• Cut the connected low frequency triangles out of the original chart
![Page 13: Lightmap compression in Halo 3](https://reader036.vdocuments.us/reader036/viewer/2022062410/568163be550346895dd4db52/html5/thumbnails/13.jpg)
Top: One chart on RiverworldBottom left: signal analysisBottom right: optimized charts
![Page 14: Lightmap compression in Halo 3](https://reader036.vdocuments.us/reader036/viewer/2022062410/568163be550346895dd4db52/html5/thumbnails/14.jpg)
Key idea 2/2 - DXT compression• Use two DXT5 textures to compress
the SH coefficients (HDR, positive/negative)
Alpha (Luminance) / 64 bits RGB / 64 bits
Alpha (Luminance) / 64 bits RGB / 64 bits
DXT[0]:
DXT[1]:
4 x 4 block:
![Page 15: Lightmap compression in Halo 3](https://reader036.vdocuments.us/reader036/viewer/2022062410/568163be550346895dd4db52/html5/thumbnails/15.jpg)
“Luvw” space• Each band of the SH coefficients
(RGB) are converted to “Luvw” space.• L: magnitude of the RGB vector
– Nonnegative– Stored in DXT5’s alpha channel because
of its better precision (3 bits palette)• Uvw: normalized vector
– Has a good coherence usually when we store it in DXT5’s rgb channels
![Page 16: Lightmap compression in Halo 3](https://reader036.vdocuments.us/reader036/viewer/2022062410/568163be550346895dd4db52/html5/thumbnails/16.jpg)
Luminance• Compress the square root of the
luminance to have a higher dynamic range
• Similar to log space, but it is cheaper to decode it
00.20.40.60.8
11.2
logsquare root
![Page 17: Lightmap compression in Halo 3](https://reader036.vdocuments.us/reader036/viewer/2022062410/568163be550346895dd4db52/html5/thumbnails/17.jpg)
Luminance compression• Use the 2nd DXT to compensate the
error( L_block: input block )
Block[0] = DXT_compress ( sqrt ( L_block ) )DXT[0]:
Alpha channel of a 4 x 4 block
Block[1] = DXT_compress ( L_block / Decompress ( Block[0] ) ) )DXT[1]:
![Page 18: Lightmap compression in Halo 3](https://reader036.vdocuments.us/reader036/viewer/2022062410/568163be550346895dd4db52/html5/thumbnails/18.jpg)
Decode and result• Luminance =
alpha0*alpha1*maximum_luminance• Result ( after 5x exposure )
– Alpha0 *Alpha1
– Alpha0 * Alpha0
– Alpha1 * Alpha1
![Page 19: Lightmap compression in Halo 3](https://reader036.vdocuments.us/reader036/viewer/2022062410/568163be550346895dd4db52/html5/thumbnails/19.jpg)
Color / uvw
Block[0] = DXT_compress ( RGB_block / 2 +0.5 )
Block[1] = DXT_compress ( ( RGB_block – Decompress ( Block[0] ) ) / 2 + 0.5 )
DXT[0]:
DXT[1]:
RGB channel of a 4 x 4 block
• Use the 2nd DXT to compensate the error( RGB_block is the input block )
• Decode:• RGB = ( rgb0 + rgb1 ) * 2 - 2
![Page 20: Lightmap compression in Halo 3](https://reader036.vdocuments.us/reader036/viewer/2022062410/568163be550346895dd4db52/html5/thumbnails/20.jpg)
3 Dimensional compression• Signal compression:
• Inter chart and sub chart optimization
• Get smaller width and height• DXT compression:
• Two DXT textures for each SH coefficient channel
• Smaller space per texel
![Page 21: Lightmap compression in Halo 3](https://reader036.vdocuments.us/reader036/viewer/2022062410/568163be550346895dd4db52/html5/thumbnails/21.jpg)
Misc Items• Use 2nd order derivative to analysis the
signal• Intra chart optimization• Geometry optimization• Its effect on lightmap farm:
– Resample or regenerate• Noise reduction• Use exp ( alpha0 + alpha1 ) if you need
more
![Page 22: Lightmap compression in Halo 3](https://reader036.vdocuments.us/reader036/viewer/2022062410/568163be550346895dd4db52/html5/thumbnails/22.jpg)
Acknowledgement• Bungie
– Xi Wang ( DXT compression )• Microsoft Research Asia
– Minmin Gong ( signal compression )