Monthly Archives: June 2015

WIP : Image Based Lighting

From past few weeks, I have been working on Image Based Lighting. Finally, I have finished writing features to generate dynamic cube maps and generate pre-convoluted probes for both diffuse (lambert) and GGX based specular.

 

Still there’s a lot of work to do. Here’s some rough list of features(or problems) I will be working on next:

  • Support for many IBL probes – I am thinking maybe 32
  • Choosing IBL probe (probes) to be used for the current pixel being shaded – I am thinking to maybe implement something similar to point light selection using tiled rendering or something. I can just replace point light calculation with cube map sampling for IBL. This way I can store all probes in a single array can bind all IBL probes to the single slot. I think this would be faster than checking the closest IBL probe for every object and passing it while shading. (Same benefits as deferred rendering over forward) 
  • Parallax correction for local probes
  • Realtime IBL probes? – I don’t know if I would need this or SSR would be good enough.
  • Fix seams for lower MIP levels. I am not sure whether I should implement parabolic maps or code some other techniques like wrap, or something.
  • Improve Pre-convolution performance by further randomizing the samples and use less number of samples.

 

HDR Rendering – Tonemapping and Bloom

I have been experimenting with tone mapping from a long time. I tried many different ways of implementing tonemapping & bloom and now I have finalized this feature in the engine.

Tone mapping is a technique used in image processing and computer graphics to map one set of colors to another to approximate the appearance of high dynamic range images in a medium that has a more limited dynamic range.

I tried few different Global tone mapping operators with various ways to calculate scene luminance.I tried 3 major approaches  (with a lot of variations in between) –

 

Method 1

In the first approach, I calculated scene luminance by averaging log luminance values of HDR render target of the scene. I did this by rendering a screen space quad calculating log luminance values for the scene and then I used GenerateMips to average them automatically for me. I tried some different tone mapping operators including Reinhard, filmic curve and modified filmic curve (or uncharted2’s filmic curve). At the end modified filmic curve with the ability to modify the curve as need turned out to be the best approach for tone mapping operator.Problem with this method is any few extreme dark/bright spots in the scene can make the whole scene look brighter or darker beyond desired ranges.

Read the rest of this entry