Fast (but not real time) Global Illumination

AndreasL

Newcomer
Hi, this is my first post so excuse me if im off the target. :)

Me and my colleagues face a problem which we are not certain how to solve.

The application we are developing is running in real time but we now got the request of adding "global illumination". :oops:
The scenario is as following:
We have a fairly tight interior scene where the walls, ceiling etc are fixed but it should be possible to move around in the scen and add, move and delete objects.
The customer can accept that it will take something like 10 seconds to recalculate the lightingafter moving, adding or deleting an object, and then it should be possible to move the camera in real time.

The scene has somewhere around 500 000 polys.
The GPU is probably going to be a nvidia workstation card. (Quadra FX 5600 probably).
We have conluded that the global illumination effect that they are after is the diffuse interreflection. (I think one light bounce should do the trick)

We have evaluated som of the existing commercial-off-the-shelf solutions but none of them seems to meet our demands. If anyone has any tips of COTS it would be great.


What we currently are looking at is to implement it ourselfs. The techniques we currently are looking at are:

Lightprobes, like the ATI global illumination-demo except we wont have to do updates to probes every frame:
http://www.youtube.com/watch?v=MPAExcS80NI

Discs, The method presented in GPU Gems 2. We could do the calculations per vertex when the scene changes and then store the values per vertex and reuse them for real time performance. We can controll tesselation to some degree.


Any suggestions or tips on how to solve this problem in the easiest way?

Thanks,
Andreas
 
This is probably not easy, but we had a similar problem on an interior/house design program program a few years ago. This was "solved" by simply using the CPU to do a rough radiosity solution when the user had not moved something in a room for a few seconds.

If the room was left alone for longer, higher detailed radiosity was calculated. (The highest level I think could take hours)

I was not involved in the radiosity calculations, but it was an inhouse solution.

Screen shots here:
http://mvh.com.au/portal/component/option,com_zoom/Itemid,170/
 
Given that you have so many polygons and you need a relatively quick answer, radiosity is probably the best choice for global illumination. If you get the number of polygons in your scene down to around 50,000, then you can brute force the problem pretty easily using a modern GPU:

http://www-sop.inria.fr/reves/Basilic/2007/DSDD07/

However, if you can't change the polygon limit, you may be better off just building a sparse matrix and updating it incrementally. For every patch, store a list of all visible patches and their respective visibility coefficients. This effectively encodes one row of the combined radiosity matrix in each patch. When you change a patch, you need to recompute the coefficients of each patch it is connected to.

Also, if you don't need exact global illumination, there are many ways to fake it. The soft shadows produced by radiosity can be achieved using variance shadows maps. Likewise, bleeding between objects can be faked using screen space ambient occlusion. Both of these techniques are really popular these days and you can find all sorts of resources by googling.
 
Back
Top