Light attenuation for deferred shading

Started by
13 comments, last by l0calh05t 16 years, 4 months ago
Ok, I am currently experimenting with deferred shading and one of the advantages of deferred shading is that many small lights (limited radius) can be rendered efficiently. But there is one problem: correct light attenuation never drops to zero. So I've been thinking about how the attenuation function could be modified to accommodate a limited radius, without this being too noticeable. I'll be assuming 1/(1+k*d^2) as the standard attenuation function, where k is the base [quadratic] attenuation coefficient, and d is the distance between the light, and the lit point. The simplest way to do this would be to just set the attenuation to 0 (as in multiply the lights intensity with 0) if the normal attenuation reaches a value of... let's say 0.01 (1% of original intensity). Obviously this would result in some quite nasty artifacts. And light radius would be constant as long as the attenuation coefficient isn't modified, but the attenuation coefficient should be constant, as it describes the attenuation in the medium (air, water or glass for example). A better way would probably be to multiply it with a function which passes through 0 at the desired radius and is 1 at a distance of 0. I think a function of the form 1-d^2/r^2 should work well enough. Using this and the same assumption that we want a cutoff at the radius where the attenuation should be 0.01 I got: (r^2-d^2)/(r^2+99*d^2) [result clamped to the range 0..1] I left out k here because this version simply sets a specified radius. Again, not particularly realistic, because we basically modify the attenuation in the medium, but ideal for artist-tunable light radius. But how should the radius of the light be determined? (This is an actual question, not a rhetorical one, despite my insanely long post/discourse ;-) ) One option I came up with is to base it on the lights intensity [Il] relative to the average intensity of the scene [Is], which should be computed for HDR scenes anyway, to be able to adjust exposure, so it's not really any extra work. (Obviously the last frame's intensity has to be used) So for a cutoff at 1% of the scene's intensity I got the following two formulae: r^2 = (100*Il-Is)/(k*Is) [if the result is negative, the light can simply be culled] att = (1-d^2/r^2)/(1+k*d^2) This can easily be adjusted to other cutoffs (the "100" in the first equation is simply 1/0.01) What do you think of this last type of attenuation? Would it work well enough? Or does anyone have any better suggestions? One potential problem might be that the feedback in the equation (via Is) might cause the average brightness of the scene to oscillate, but I think it is improbable that this would happen, as usually the intensity is averaged over time because an instant change in exposure wouldn't look particularly good. (Ok... that was one loooong post :-P)
Advertisement
There is no correct way to modify the function for intensity as a function of distance to have a strict cutoff because that is not realistic as you pointed out. Given some arbitrary attenuation function f(x), just pick a cutoff X_max where f(x) is neglibible, then define g(x) = 1 - 1/X_max*x, and use f'(x)=f(x)*g(x) as your new attenuation func.

as a side not, where does that model for light attenuation you are using as a basis come from? 1/(1+kx^2)? because i doubt that is realistic at all. the energy of an electromagneti wave emitted from a point source decreases via the inverse square law, that is, k/x^2, but in addition the molecular density of the medium which is travels through will absorb and further reduce that, that equation is P(x)=exp(-mx) acccording to this guy (http://plus.maths.org/issue13/features/garbett/index.html), so your final equation would be k*exp(-mx)/x^2...if your basic attenuation function has no physical basis, dont waste too much time trying to modify it in a physically correc way
Quote:as a side not, where does that model for light attenuation you are using as a basis come from? 1/(1+kx^2)? because i doubt that is realistic at all.


Having a non-zero constant there actually is much more realistic than just plain-jane 1/(kx^2) because the latter shoots to infinity; something real-life (and non-point) lights just don't do.

Fwiw, one option you might want to entertain is having a 1D texture-based lookup for the attenuation, which gives you way more control over the attenuation as a whole: you can have it go from 1 to 0 however you want, and due to linear interpolation can even have it smoothly (and often unnoticably) drop to zero. Plus, you can throw complex equations such as that e^(-mx) stuff without a) making a new shader and b) not incurring any extra cost relative to a quadratic operation.
@yahatsu: As I already pointed out in the second line of my original post, correct light attenuation never drops to zero, so yes there is no right way to do this, but I was talking about finding a function which is a sufficiently close approximation and has a smooth cutoff, so that it looks realistic.

You are absolutely right about the quadratic attenuation of a point source, but a point source itself is always an approximation since there are no point sources in real life. In real life, no matter how close you go to a light source (or any other other source of magnetic waves) the maximum intensity when moving closer to it will always be a finite constant, exactly what the function 1/(1+kd^2) provides.

You are also right about the exponential function for decay due to absorption by a medium, but again: I am only looking for a good approximation, and the exponential factor can be approximated quite well by modifying k in the equation I have given. (See pic below comparing 1/(1+1.3*x^2) [red] and e^(-0.1*x)/(1+x^2) [black])

Free Image Hosting at www.ImageShack.us

--

@Cypher19:

Isn't the cost of a simple quadratic function such as 1/(1+kd^2) quite close to an extra texture lookup on modern cards? And texture lookups suffer from the same basic problems as (r^2-d^2)/(r^2+99*d^2) i.E. the radius is independent from the intensity unless you scale the function as a whole, effectively modifying the rate of attenuation.
Quote:Having a non-zero constant there actually is much more realistic than just plain-jane 1/(kx^2) because the latter shoots to infinity; something real-life (and non-point) lights just don't do.


Are you sure about that? It only goes to infinity when the distance asymptotically approaches zero. Have you ever asymptotically approached a light source? I've never looked at a light source from 2-quark radii away, so I don't know. In real life the maximum distance you get to a light is limited by the physical space that the light enclosure assumes etc.

Point vs non-point source makes a big difference for soft shadowing but I don't think it makes any difference for attenuation. You could think of a non-point source as being an infinite collection of point sources, then you see your attenuation would still be an inverse square one, so you can still use inverse square attenuation for non-point sources..no?

Quote:@yahatsu: As I already pointed out in the second line of my original post, correct light attenuation never drops to zero, so yes there is no right way to do this, but I was talking about finding a function which is a sufficiently close approximation and has a smooth cutoff, so that it looks realistic.


I hear you, which is why I suggest just multiplying your existing function by a linear attenuation cutoff. Doesn't that do exactly what you want?

Thanks for showing that graph. I didn't notice how closely those two functions match. However, since you equated it to the absorption equation, I guess that proves that it does not account for light attenuation due to the spreading out of photons (the inverse square thing)...wouldn't you want that also to be accounted for?
Quote:Original post by yahastu
Are you sure about that? It only goes to infinity when the distance asymptotically approaches zero. Have you ever asymptotically approached a light source? I've never looked at a light source from 2-quark radii away, so I don't know. In real life the maximum distance you get to a light is limited by the physical space that the light enclosure assumes etc.

Point vs non-point source makes a big difference for soft shadowing but I don't think it makes any difference for attenuation. You could think of a non-point source as being an infinite collection of point sources, then you see your attenuation would still be an inverse square one, so you can still use inverse square attenuation for non-point sources..no?


I agree with Cypher on this. Consider this: The inverse square law stems from the spherical expansion of waves from a point source (See: http://hyperphysics.phy-astr.gsu.edu/hbase/vision/isql.html). Now if you have a non-point light you agree that it's brightness is finite, right? Yet from a wave propagation point of view we have an infinite number of point sources! (the whole surface of our real light) Now why is this possible? Well, each of these point sources has an infinitesimally low intensity, and you can only ever be asymptotically close to one of these practically-zero intensity point sources.

Another point is: Light sources only emit a limited number (albeit extremely large) of photons in every unit of time, so infinite strength, even at a distance of 0 is impossible.

Quote:I hear you, which is why I suggest just multiplying your existing function by a linear attenuation cutoff. Doesn't that do exactly what you want?


Not really, because that causes a much sharper falloff close to zero. In my original post I suggested multiplying by (1-d^2/r^2) because that effectively "stretches" the attenuation downward slightly. although of course the actual cutoff is sharper...

Quote:Thanks for showing that graph. I didn't notice how closely those two functions match. However, since you equated it to the absorption equation, I guess that proves that it does not account for light attenuation due to the spreading out of photons (the inverse square thing)...wouldn't you want that also to be accounted for?


The graph compares 1/(1+1.3*x^2) and e^(-0.1*x)/(1+x^2), so it compares the attenuation function with a changed attenuation constant, to the attenuation function multiplied by the absorption equation, so it already does both.
Quote:Original post by l0calh05t
Consider this: The inverse square law stems from the spherical expansion of waves from a point source. Now if you have a non-point light you agree that it's brightness is finite, right? Yet from a wave propagation point of view we have an infinite number of point sources! (the whole surface of our real light) Now why is this possible? Well, each of these point sources has an infinitesimally low intensity, and you can only ever be asymptotically close to one of these practically-zero intensity point sources.

Another point is: Light sources only emit a limited number (albeit extremely large) of photons in every unit of time, so infinite strength, even at a distance of 0 is impossible.


I agree with everything you said in this paragraph. From the first paragraph: Yes, you approach an infinitesimally low-intensity light source...and as you do, the energy of the wave function approaches infinity.

From the second paragraph: true, but the deviation from inverse square would not occur until you got to sub atomic distances...which doesn't really apply to computer games.

These limiting cases we have been discussing are not even relevant, because in the physical world the distance you can get is going to be limited by electromagnetic repulsions....so I would say that the only reason lights appear to have a maximum brightness is because there is a minimum on the distance you can observe them from...combined with the automatic gamma adjustment that your eyes do, which make a light APPEAR to not get brighter as you get closer, because your brain can only perceive a finite amount of brightness.

If your game isn't doing HDR dynamic range adjustments, then I would say that is a good attenuation model. But I think a lot of this "finite brightness" stuff is really just due to automatic adjustment in perception by the eye.
Quote:Original post by yahastu
I agree with everything you said in this paragraph. From the first paragraph: Yes, you approach an infinitesimally low-intensity light source...and as you do, the energy of the wave function approaches infinity.


This, I believe, is where you are mistaken.
sin(x) becomes infinitesimally small when you approach x->0
1/x becomes infinitely large when you approach x->0
sin(x)/x becomes 1 when you approach x->0

Quote:From the second paragraph: true, but the deviation from inverse square would not occur until you got to sub atomic distances...which doesn't really apply to computer games.


From the wikipedia article on the topic of Point sources:

Quote:
Light

Generally a source of light can be considered a point source if the resolution of the imaging instrument is too low to resolve its size, or if the object is at a very great distance.

Examples:

* Light from a distant star seen through a small telescope
* Light passing through a pinhole or other small aperture, viewed from a distance much greater than the size of the hole
* Light from a street light in a large-scale study of light pollution or street illumination


You would agree that none of these apply here, correct?

How about a little analogy of astronomical scale:
The inverse square law also applies to gravity.
But yet, the gravity on earth is quite finite. And we are actually touching it's surface. (And if we dig a hole to the center of earth gravity would become less, not more!)
From the wikipedia article: "In mathematics, a point source is a singularity from which flux or flow is emanating."
So, what's the closest thing to an actual point source? A black hole (aka singularity), because it's gravity is very high compared to it's size.
I believe our lights aren't even close. ;-)

Quote:These limiting cases we have been discussing are not even relevant, because in the physical world the distance you can get is going to be limited by electromagnetic repulsions....so I would say that the only reason lights appear to have a maximum brightness is because there is a minimum on the distance you can observe them from...combined with the automatic gamma adjustment that your eyes do, which make a light APPEAR to not get brighter as you get closer, because your brain can only perceive a finite amount of brightness.

If your game isn't doing HDR dynamic range adjustments, then I would say that is a good attenuation model. But I think a lot of this "finite brightness" stuff is really just due to automatic adjustment in perception by the eye.


See the above points ;-)

I'd recommend you should read the wiki article yourself ( http://en.wikipedia.org/wiki/Point_source ) maybe also look at the article mentioned under "See also". (It deals with the potential finity of infinity :-P)
Quote:How about a little analogy of astronomical scale:
The inverse square law also applies to gravity.
But yet, the gravity on earth is quite finite. And we are actually touching it's surface.


Barring the difference that the Earth represents a large number of point surfaces inside a spherical a volume, whereas before we were considering a large number of point surfaces distributed over the surface of a sphere, this is a pretty good example.

It is true that acceleration (and hence, also force) is approximated by the constant 9.8 m/s^2 at sea level. However, think about where that number comes from. It is the integral of the squared distance between each particle in object A with each particle in the Earth. As the distance between the radii of Earth and object A increases, the the ratio of relative difference between any two particle-pairs compared to the difference between radii becomes insignificant. Thus, the two objects can be represented as point sources at a distance for the calculation, and the force of gravity can be treated as constant for that distance.

However, your assumption that gravity on Earth does not follow the inverse square law just because it is finite is not true. If object A were to asymptotically approach the surface of Earth, then some particle pair differences would become extremely high; specifically, the distance between you and a particle on the surface next to you would be close to zero, and the distance between you and a particle on the opposite side of Earth would be the diameter of the Earth. Under this condition, approximating the Earth as a point source where all points are equal distance is no longer valid. In the limiting case, in fact, the equation for force would approach F=mP*m/(rp^2), where mP is the mass of the 1 particle you were closest to, and rp were the distance of you (assuming you are 1 particle just to make things simple, the result is the same if you are multi particulate). Thus, the force of gravity of the Earth does go to infinity according to these simplifications.

In reality, this cannot actually go to infinity, for several reasons. Electromagnetic repulsions that keeps molecules apart from each other give you a cushion of distance that you cannot get through, so you cannot actually approach a point on the surface. Secondly, if you did, fission and fusion would occur, changing the mass of the particles involved. Thirdly, the uncertainty principle forbids your position to be known infinitely for a constant mass, so it is impossible to approach something asymptotically. Fourthly, the inverse square law is not valid at quantum levels anyway because it approximates the EM field as waves, not quantized particles.

So, what is my point?
1) The inverse square law does not apply to subatomic or quantum scales, and thus just because the equation goes to infinity, does not mean it goes to infinity in reality, because as I said earlier, there is a limit to how small the distance can be...and the equation becomes invalid below atomic distances anyway.

2) The Earth DOES follow an inverse square law!

If you consider the Earth as a POINT source of mass and apply the equation for gravity at the radius of the Earth's surface, you get:

a_object = G m_earth / rEarth^2

(6.67300 × 10-11 m3 kg-1 s-2) * (5.9736×1024 KG) / (6 378.1 kilometers^2)^2

*** = 9.7988 m/s^2 ***

Thus, it is valid to represent the Earth as a point source that follows the inverse square law, even though it is not a point source of mass.

3) Therefore, it is also valid to represent a non-point light with the inverse square law in terms of the energy of the wave function...but like the Earth, it does not go to infinity, because you cannot allow sub atomic distances...so the distance is limited by the radius of the physical light size

[Edited by - yahastu on November 30, 2007 1:36:00 PM]
There's a couple of equations on the Delphi3D site about attenuation:

http://www.delphi3d.net/articles/viewarticle.php?article=phong.htm

Regards
elFarto

This topic is closed to new replies.

Advertisement