# Integrating Image Based Lighting

This topic is 1347 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

In my forward renderer I am using a PBR shader for my materials and the final lighting equation looks something like (in sort of pseudo code and ignoring the fact that I have multiple analytical lights)


diffuseComponent = diffuseLighting * materialDiffuseColor;
specularComponent = specBRDF * materialSpecColor;
outputCol = (1.0 - specularIntensity) * diffuseComponent  + specularIntensity * specularComponent ;


And I am now willing to incorporate in this a basic IBL for both diffuse lighting and reflection.

I was reading a bit online but I found only material where they have entirely reflective material ( the final color is the queried reflection from cubemap ) or with just diffuse.

For the diffuse I thought of just multiply my diffuseComponent by the value retrieved from irradiance map.

I am now unsure where to put the reflection. I that this should be related to the roughness of the surface, but while I have a couple ideas but neither satisfy me.

Where should I put the reflections so to maintain a PBR shading? Adding params wouldn't be an issue.

Thank you!

##### Share on other sites

Cube map is reflection, if you render cube map each frame you will get real time reflections

##### Share on other sites

In an offline quality renderer, you'd sample every pixel in the environment map, treating them as a little directional light (using your full BRDF function), which is basically integrating the irradiance.
This is extremely slow, but correct... Even in an offline renderer, you'd optimise this by using importance sampling to skip most pixels in the environment map.

For a realtime renderer, you can 'prefilter' your environment maps, where you perform the above calculations ahead of time. Unfortunately the inputs to the above are at a minimum, the surface normal, the view direction, the surface roughness and the spec-mask/colour... That's 4 input variables (some of which are multidimensional), which makes for an unpractically huge lookup table.
So when prefitering, typically you make the approximation that the view direction is the same as the surface normal and the spec-color is white, leaving you just with surface normal and roughness.
In your new cube-map, the pixel location corresponds to the surface normal and the mip-level corresponds to the roughness. For every pixel in every mip of this new cube-map, sample all/lots of the pixels in the original cube-map * your BRDF (using the normal/roughness corresponding to that output pixels position).

To add to this, there was a quite nice explanation given at SIGGRAPH 2013 on how they filter their cubemaps in Unreal 4. They split the problems into two parts and solve each part separately in different lookup textures. The first part is an actual prefiltered environment map using importance sampling as Hodgman describes, the second part is a lookup table containing your environment BRDF and is expressed in terms of your surface roughness and viewing angle.

The only real effort involved in implementing this is building your tools to generate the environment map and LUT. Once this is done it will be a breeze to implement the evaluation of these in your shader.

Slides can be found here, course notes here

1. 1
2. 2
Rutin
18
3. 3
4. 4
5. 5

• 14
• 12
• 9
• 12
• 37
• ### Forum Statistics

• Total Topics
631432
• Total Posts
3000040
×