PBR Materials

SourceEdit
-- Skybox is "industrial_pipe_and_valve_01" from PolyHaven (CC0)
-- Assets were generated from the skybox using cmgen from filament:
-- $ ./cmgen --format=png --extract=skybox -s 512 industrial_pipe_and_valve_01_4k.hdr
-- $ ./cmgen --format=ktx -x out industrial_pipe_and_valve_01_4k.hdr

function lovr.load()
  model = lovr.graphics.newModel('DamagedHelmet.glb')

  shader = lovr.graphics.newShader([[
    vec4 lovrmain() {
      return DefaultPosition;
    }
  ]], [[
    uniform textureCube cubemap;
    uniform sphericalHarmonics { vec3 sh[9]; };

    vec4 lovrmain() {
      Surface surface;
      initSurface(surface);

      vec3 color = vec3(0);
      vec3 lightDirection = vec3(-1, -1, -1);
      vec4 lightColorAndBrightness = vec4(1, 1, 1, 3);
      float visibility = 1.;
      color += getLighting(surface, lightDirection, lightColorAndBrightness, visibility);
      color += getIndirectLighting(surface, cubemap, sh);

      return vec4(color, 1);
    }
  ]], {
    flags = {
      glow = true,
      normalMap = true,
      vertexTangents = false, -- DamagedHelmet doesn't have vertex tangents
      tonemap = true
    }
  })

  skybox = lovr.graphics.newTexture({
    px = 'skybox/px.png',
    nx = 'skybox/nx.png',
    py = 'skybox/py.png',
    ny = 'skybox/ny.png',
    pz = 'skybox/pz.png',
    nz = 'skybox/nz.png'
  })

  environmentMap = lovr.graphics.newTexture('ibl.ktx')

  sphericalHarmonics = lovr.graphics.newBuffer({ 'vec3', layout = 'std140' }, {
    {  0.611764907836914,  0.599504590034485,  0.479980736970901 },
    {  0.659514904022217,  0.665349841117859,  0.567680120468140 },
    {  0.451633930206299,  0.450751245021820,  0.355226665735245 },
    { -0.044383134692907, -0.053154513239861, -0.019974749535322 },
    { -0.053045745939016, -0.057957146316767, -0.011247659102082 },
    {  0.485697060823441,  0.490428507328033,  0.397530466318130 },
    { -0.023690477013588, -0.024272611364722, -0.021886156871915 },
    { -0.179465517401695, -0.181243389844894, -0.141314014792442 },
    { -0.144527092576027, -0.143508568406105, -0.122757166624069 }
  })
end

function lovr.draw(pass)
  pass:setCullMode('back')
  pass:setBlendMode()

  pass:skybox(skybox)

  pass:setShader(shader)
  pass:send('cubemap', environmentMap)
  pass:send('sphericalHarmonics', sphericalHarmonics)
  pass:draw(model, 0, 1.5, -1.5, .5)
end