PBR envtools



PBR envtools

0 1


ParisWebGL2015


On Github cedricpinson / ParisWebGL2015

PBR envtools

by Cedric Pinson / @trigrou @sketchfab

  • Cedric Pinson, Developer OpenGL/WebGL.
  • Je suis co fondateur et CTO de sketchfab
  • Je vais presenté les outils qu'on utilise pour le rendu PBR
  • faire une update par rapport a mon talk de l'année derniere

Light [1]

Micro geometry

  • Comment la lumiere interagit avec la matiere ?
  • quasi toutes les surfaces on des micro geomtry
  • ce sont des micro bosse plus grandes qu'une longeur d'onde de lumiere, mais trop petit pour etre visible
  • chaque point refletes et refracte la lumiere dans differentes directions
  • L'apparence de la surface est un agregat de toutes les directions des reflection/refractions

Surface rough

  • Moins une surface est lisse et plus la reflection sera flou

Surface plane

  • Plus c'est lisse et plus la reflection est nette, comme un miroir

Approximation

Diffuse / Specular

  • Expliquer la refraction
  • Diffuse correspond au resultat de la refraction/scatering/absorption
  • Specular la reflection

Microfacet Specular BRDF [1]

  • F, Fresnel factor
  • G, Geometry function
  • D, Normal distribution function
  • C'est une parti de cette formule qu'on va precalculer dans les outils d'environment
  • Allez voir les liens pour le detail

Diffuse [2]

  • La partie diffuse va aussi etre precalculer
  • Disney Brent Burley
  • Oren nayar
  • De plus en plus ya un desir d'integrer un model qui prend en compte la roughness dans le brdf de diffuse

Image Based Lighting

Use enfironment as lightsource

image from hdri-hub.com [3]
  • En general on integre le BRDF sur la lumiere qui vient de toutes les directions
  • L'environment est comme un cache de la radiance qui vient de toutes les directions
  • Dans les jeux on va pre/computer des environments localisé qui vont etre utilisé a la place de l'environment global
  • Permet d'avoir des reflection localisé

Prefiltering Environment

  • Mitsuba [4] for reference
  • Diffuse, Cubemap / SH - cubemapgen [5]
  • Specular, Cubemap - UE4 [6], Frostbite [7]
  • Le prefiltering, introduit par Brian Karis, ca permet d'integrer le BRDF sur une cubemap et une texture de lookup
  • Splitté en 2 fonctions
  • Lod roughness
  • Specular, c'est precalculer un environment pour un niveau de roughness donné
  • Diffuse (lambert), c'est l'integration de l'hemisphere en une point
  • Diffuse, brdf avec roughness
  • Utiliser mitsuba pour faire des tests de rendu
  • a chaque point on regarde la roughness, et on choisie dans le bon niveau de LOD
  • 11 Min

WebGL Stats [8]

Cubemap seams

No ARB_seamless_cube_map extension

AMD cubemap gen has code to fixup [5]

image from Ignacio Castaño post [9]

Panorama lod fallback

better alternative Octahedral projection [10]

  • besoin de shifter les uvs en fonction du lod
  • slower than cubemap access
  • d'autre method, jeff russel webgl insight

Envtools [11]

  • Spherical Harmonics for diffuse
  • Panorama and Cubemap GGX
  • Environment preview
  • Blurred environment background
  • Color encoding (float,rgbe,rgbm,luv)
  • MulitThread / OpenCL
  • Slow
  • Sample count
  • 5 min

Demo [4]

  • Gold
  • roughness constante, metalness [0-1]
  • non metal, roughness [0-1]
  • metal, roughness [0-1]
  • montrer les pb d'encoding
  • cubemap 256 donne deja une bonne resolution
  • montrer les differents models
  • montrer les pb d'aliasing
  • 7 min

Samples count

  • Depends on the HDR range
  • Depends on roughness level
  • On peut faire varier le nombre de sample
  • plus le roughness est haut et plus ya besoin de sample car le lob est plus grand

Samples range:1500

1024

2048

4096

8192

16384

32768

65536

  • Enlever le soleil et les lumiere forte
  • et les simulé en dehors pour eviter de les integrer dans les environments

Optimization

Importance Sampling [12]

Importance Sampling [12]

Color Encoding

float

rgbm

rgbe

luv

  • on a choisi luv pour notre context
  • c'est celui qui presente le moins de bug visible

Color Encoding

float

rgbm

rgbe

luv

  • on a choisi luv pour notre context
  • c'est celui qui presente le moins de bug visible

Storage 256

Interleave size format encoding 1.3M panorama luv 1.6M panorama rgbm 1.7M panorama rgbe 7.2M panorama float 1.1M cubemap luv 1.4M cubemap rgbm 1.4M cubemap rgbe 5.5M cubemap float
Bitplane size format encoding 687K panorama luv 1002K panorama rgbm 924K panorama rgbe 6.9M panorama float 646K cubemap luv 944K cubemap rgbm 885K cubemap rgbe 5.2M cubemap float
  • store bitplane instead of interleaved

Resources

[1] Natty Hoffman, Physics and Math of Shading [2] Sebastien Lagarde, PI or not to PI in game lighting equation [3] HDR environment hdri-hub.com [4] Mitsuba PBR renderer [5] Sebastien Lagarde, AMD Cubemapgen for PBR [6] Brian Karis, Epic UE4 shading [7] Charles de Rousiers & Sébastian Lagarde, Moving Frostbite to PBR [8] Florian Boesch, WebGL stats [9] Ignacio Castaño, post about cubemap seams [10] Jeff Russel, HDR image based lighting on the web [11] Cedric Pinson, envtools [12] GPU based importance sampling [13] Padraic Hennessy, Runtime Environment Map Filtering for Image Based Lighting [14] Christer Ericson, Converting RGB to LogLuv in a fragment shader [15] Brian Karis, RGBM color encoding [16] Sketchfab

Thank you

by Cedric Pinson / @trigrou @sketchfab