One of the most used approximations in all of graphics is the
Schlick approximation by
Christophe Schlick. It says the Fresnel reflectance of a surface can be approximated by a simple polynomial of cosine(theta). For dielectrics, a key point is that this theta is the bigger of the two regardless of which direction the ray is traveling.
|
Regardless of light direction, the blue path is followed. Regardless of light direction, the larger of the two angles (pictured as theta) is used for the Schlick approximation. |
A sharp reader of
my mini-book pointed out I have a bug related to this in my code. I was surprised at this because the picture looked right (sarcasm). The bug in my code and my initial fix is shown below.
|
The old code shown in blue is replaced with the next two lines. |
My mistake was to pretend that if snell's law applies to sines, n1*sin(theta1) = n2*sin(theta2), it must also apply to cosines. It doesn't. (The fix is just to use cos^2 = 1 - sin^2 and do some algebra) I make mistakes like this all the time, but usually the wonky-looking picture, but in this case it didn't. It only affected internal reflections, and it just picked some somehwhat arbitrary value that was always between 0 and 1. Since real glass balls look a little odd in real life, this is not something I can pick up. In fact I am not sure which picture looks right!
|
Old picture before bug fix. |
|
New picture after bug fix. |
|
|
|
I am reminded of spherical harmonic approximation to diffuse lighting. It looks different than the "correct" lighting, but not worse. (In fact I think it looks better). What matters about hacks is their robustness. It's best to do them on purpose though...
1 comment:
Are you bugfixing the kindle book? if I buy you now your book in amazon, have you updated all the bugs that readers have said to you?.
Post a Comment