lightmap compression in halo 3

22
Lightmap compression in Halo 3 Yaohua Hu Bungie

Upload: didina

Post on 23-Feb-2016

60 views

Category:

Documents


2 download

DESCRIPTION

Lightmap compression in Halo 3. Yaohua Hu Bungie. Halo 3’s light probe textures. Spherical harmonic coefficients It is large Size: 1024x1024 (usually) Each texel is a vector: 5*3 float values. Halo3’s lightmap compression. Signal compression: Inter chart and sub chart optimization - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Lightmap compression in Halo 3

Lightmap compression in Halo 3

Yaohua HuBungie

Page 2: Lightmap compression in Halo 3

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

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

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

Initial result (2005)• Original signal: • Compressed to a

quarter size:

Page 6: Lightmap compression in Halo 3

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

What we work with• Charts are our basic working

elements– 6018 charts in Zanzibar:

Page 8: Lightmap compression in Halo 3

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

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

Top: lightmap on ZanzibarBottom left: artist’s outputBottom right: optimized lightmap

Page 11: Lightmap compression in Halo 3

Top: lightmap on ZanzibarBottom left: artist’s outputBottom right: optimized lightmap

Page 12: Lightmap compression in Halo 3

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

Top: One chart on RiverworldBottom left: signal analysisBottom right: optimized charts

Page 14: Lightmap compression in Halo 3

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

“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

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

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

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

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

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

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

Acknowledgement• Bungie

– Xi Wang ( DXT compression )• Microsoft Research Asia

– Minmin Gong ( signal compression )