[Haskell-cafe] Glome raytracer bug: bad output with -O2 -fasm
jsnow at cs.pdx.edu
Fri Mar 28 20:41:15 EDT 2008
Luke Palmer wrote:
> On Fri, Mar 28, 2008 at 6:28 AM, Jim Snow <jsnow at cs.pdx.edu> wrote:
>> I was trying to get Blinn highlights working with my raytracer, and kept
>> getting ugly artifacts. After trying a bunch of things, I finally
>> compiled without -O2, and the artifacts went away.
>> Here's what I mean:
>> Here's the offending code, run "./make" and "./run" and you should see
>> the artifacts if your setup is the same as mine. (Requires OpenGL.)
>> The artifacts also go away if I use -fvia-C. It doesn't seem to matter
>> whether I use Floats or Doubles in the rendering code. The artifacts
>> also show up with -O1. Have I stumbled across a known compiler bug? Or
>> perhaps an OpenGL bug? (The bug could, of course, be in my code, but
>> then one might expect to get the same erroneous output every time
>> regardless of compiler flags.)
>> To reiterate, I'm using ghc 8.6.2.
> You probably mean 6.8.2.
Yes, my mistake. 6.8.2.
> Works for me in all cases.
> % uname -a
> Linux madhatter 2.6.22-gentoo-r8 #6 PREEMPT Sat Oct 20 04:19:22 GMT
> 2007 i686 AMD Turion(tm) 64 Mobile Technology ML-40 AuthenticAMD
> % ghc --version
> The Glorious Glasgow Haskell Compilation System, version 6.8.2
> Looks to me like Glome is depending on some very fine details of
> floating point arithmetic.
After looking into this for awhile, I found that the problem was that in
computing my Blinn factor:
blinn = fmax 0 $ (vdot halfangle n) ** shine
the (vdot halfangle n) was sometimes negative, resulting in blinn being
"NaN". OpenGL apparently interprets "NaN" as "1.0" for the purposes of
color*, so those patches were rendered bright white. It's still a bit
mysterious why the case where (vdot halfangle n) is negative only occurs
if I compile with "-fasm", but I can work around it for now.
* I'm using the binary-only nvidia drivers; different OpenGL
implementations may behave differently.
More information about the Haskell-Cafe