phong illumination model question

Started by
2 comments, last by goltrpoat 23 years, 11 months ago
ok.. having coded a raytracer a long time ago, i decided to do it again and this time write a "proper" raytracer, with surface properties that are slightly more involved than a texture lookup modulated by N dot L. so, while implementing the ubiquitous phong illumination model, i ran into the following problems. the phong illumination model (omitting the color properties) is defined as KaIa+att[KdId*(N dot L)+KsIs*(R dot V)^n], K being the material properties, I being the light properties, N being the surface normal, L being the light vector, R is the ray reflected about the surface and V is the view vector. here''s the first problem: att, the attenuation factor, is computed as att = 1/(d^2), d being the distance from the light to the point. in my little standard "five balls hanging over a floor" scene, the distances between the point light source and any surface are pretty big (around 200 units at least). needless to say, that makes att a really small number, and i end up with surfaces that are only ambient shaded. is this actually supposed to be something like att=attdist/(d^2), attdist being some (large) constant for a particular light? or am i missing something? question #2: lets say i decide to forego the attenuation for testing purposes and set att to 1. that brings on the second problem. V is constant at (0,0,1). therefore, R dot V is the Z component of R. if you picture a sphere, rays hitting it from your eye and reflecting along the surface, you end up with vectors whose Z component approaches 1.0 as the vectors approach the "edge" of the sphere. english: i end up with a big ass black blob in the center of the sphere instead of a nice little specular highlight at Ks=0.5,n=30 that we''ve all come to love and cherish after looking at the cook-torrance and blinn-phong material tables. what gives? -goltrpoat -- Float like a butterfly, bite like a crocodile.
--Float like a butterfly, bite like a crocodile.
Advertisement
nevermind, figured it out.. attenuation is better defined using a quadratic with empiric constants, and V is actually the vector from the viewpoint to the point of intersection..

-goltrpoat


--
Float like a butterfly, bite like a crocodile.

--Float like a butterfly, bite like a crocodile.
While you have the correct attenuation formula (1/d2) it is very common to use a formula like this:

att = 1/(a + b*d + c*d2)

a,b, and c being the attenuation factors. The reason for this formula is that it is easier to get pleasing lighting in your rendering. a keeps the light from saturating near the source. b can be used for sources such as spotlights where the light isn''t spreading in an even sphear. c, well you already know that one.

Both OpenGL and Direct3D use this formula when they compute the light affecting a vertex.



- WitchLord

AngelCode.com - game development and more - Reference DB - game developer references
AngelScript - free scripting library - BMFont - free bitmap font generator - Tower - free puzzle game

right.. that''s what i meant when i said ''quadratic with empiric constants''

--
Float like a butterfly, bite like a crocodile.

--Float like a butterfly, bite like a crocodile.

This topic is closed to new replies.

Advertisement