[Haskell-cafe] Glome raytracer bug: bad output with -O2 -fasm

Jim Snow 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:
>>  http://syn.cs.pdx.edu/~jsnow/glome/Glome.hs-noartifact.png
>>  http://syn.cs.pdx.edu/~jsnow/glome/Glome.hs-artifact.png
>>
>>  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.)
>>  http://syn.cs.pdx.edu/~jsnow/glome/glome.hs-0.2-bug.tar.gz
>>
>>  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
> GNU/Linux
> % 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.
>
> Luke
>   
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.

-jim


* I'm using the binary-only nvidia drivers; different OpenGL 
implementations may behave differently.


More information about the Haskell-Cafe mailing list