Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

50
Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati

Transcript of Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Page 1: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Real-time lighting via Light Linked List

8/07/2014

Abdul Bezrati

Page 2: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Old: Deferred Lighting

Page 3: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Old: Deferred Lighting

Page 4: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Old: Deferred Lighting

Page 5: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

New: Light Linked List

Page 6: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Deferred Lighting

GBufferr

Fill Light Buffers

Light GBuffer

Alpha

Page 7: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Diffuse Lighting

Page 8: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Specular Lighting

Page 9: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

New approach

• Store lights in a per-pixel linked list.

Page 10: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Compressed Fragment

Page 11: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Resolution

• Lower resolutions are better:– One quarter, one eighth etc…

Page 12: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Memory Cost

• 4 Buffers at one eighth resolution:– 2 RWByteAddressBuffer– 1 RWStructuredBuffer– 1 Depth Buffer (optional)

• Pre-allocate average 40 Lights per pixel.• Total cost:

– 900P: ~7.25 megs – 1080P: ~10.15 megs

Page 13: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.
Page 14: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.
Page 15: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Insomniac EngineGBufferr

Fill Linked Listr

Light GBuffer

Custom Materials

Alpha

Page 16: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Insomniac EngineGBuffer

(fast path)

Fill Linked Listr

Light GBuffer

Custom Materials

Alpha

Page 17: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.
Page 18: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.
Page 19: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.
Page 20: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.
Page 21: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.
Page 22: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Insomniac EngineGBufferr

Fill Linked List

Light GBuffer

Custom Materials

Alpha

Page 23: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Fill LLL Cost 900P

Page 24: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Fill LLL Cost 1080P

Page 25: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

LLL Depth Buffer

• Generate down-sized depth buffer.• Use conservative depth selection.• Use GatherRed.

Page 26: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Light Shells

Page 27: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

LLL Shader Steps

• Software depth test.

• Acquire min and max depth.

• Allocate a LLL fragment.

Page 28: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

LLL Depth Test

Page 29: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

LLL Depth Test

• Software test front faces.

Page 30: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.
Page 31: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.
Page 32: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Depth Bounds

• Both depths need to come through.

• Which depth comes first?

Page 33: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Depth Bounds

• Bounds RWByteAddressBuffer

Pixel Pixel Pixel Pixel Pixel Pixel Pixel Pixel

Pixel Pixel Pixel Pixel Pixel Pixel Pixel Pixel

Pixel Pixel Pixel Pixel Pixel Pixel Pixel Pixel

Pixel Pixel Pixel Pixel Pixel Pixel Pixel Pixel

Pixel Pixel Pixel Pixel Pixel Pixel Pixel Pixel

Pixel Pixel Pixel Pixel Pixel Pixel Pixel Pixel

Pixel Pixel Pixel Pixel Pixel Pixel Pixel Pixel

Pixel Pixel Pixel Pixel Pixel Pixel Pixel Pixel

Page 34: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Depth Bounds

• Encode Depth + ID– 16 bits ID– 16 bits Depth

Page 35: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Depth Bounds

• Use InterlockedExchange 

New Info

Old Info

Pixel Pixel Pixel Pixel Pixel Pixel Pixel Pixel

Pixel Pixel Pixel Pixel Pixel Pixel Pixel Pixel

Pixel Pixel Pixel Pixel Pixel Pixel Pixel Pixel

Pixel Pixel Pixel Pixel Pixel Pixel Pixel Pixel

Pixel Pixel Pixel Pixel Pixel Pixel Pixel Pixel

Pixel Pixel Pixel Pixel Pixel Pixel Pixel Pixel

Pixel Pixel Pixel Pixel Pixel Pixel Pixel Pixel

Pixel Pixel Pixel Pixel Pixel Pixel Pixel Pixel

Page 36: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Light Fragment Links

• Use a RWStructuredBuffer for storage:

Page 37: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Allocate LLL Fragment

• Increment current count

Page 38: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Track Last Entry

• StartOffset RWByteAddressBuffer:– InterlockedExachange 

New Index

Old Index

Pixel Pixel Pixel Pixel Pixel Pixel Pixel Pixel

Pixel Pixel Pixel Pixel Pixel Pixel Pixel Pixel

Pixel Pixel Pixel Pixel Pixel Pixel Pixel Pixel

Pixel Pixel Pixel Pixel Pixel Pixel Pixel Pixel

Pixel Pixel Pixel Pixel Pixel Pixel Pixel Pixel

Pixel Pixel Pixel Pixel Pixel Pixel Pixel Pixel

Pixel Pixel Pixel Pixel Pixel Pixel Pixel Pixel

Pixel Pixel Pixel Pixel Pixel Pixel Pixel Pixel

Page 39: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Light Fragment Encoding

• Fill the linked light fragment and store it.

Page 40: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Insomniac EngineGBufferr

Fill Linked Listr

Light GBuffer

Custom Materials

Alpha

Page 41: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Lighting the GBuffer

• Draw full-screen quad• Access the LLL• Apply the light

Page 42: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Accessing the SRVs

• Fetch the first linked element offset:– The first linked element is encoded in the lower

24 bits.

Page 43: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Light Loop

• Start the lighting loop:– An element index equal to 0xFFFFFF is invalid.

Page 44: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Decoding Light Depth

• Decode the light min and max depth.• Compare the light depth.

Page 45: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Access Light Info

• Fetch the full light information:

Page 46: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Insomniac EngineGBufferr

Fill Linked Listr

Light GBuffer

Custom Materials

Alpha

Page 47: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Custom Materials

• Render geometry again.• Access the LLL while rendering.

Page 48: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Custom Materials

Page 49: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Shadows?

Page 50: Real-time lighting via Light Linked List 8/07/2014 Abdul Bezrati.

Questions?

[email protected]