The mother of all dumb FBO mistakes

The mother of all dumb FBO mistakes

by baggers

I have been smacking my head against an issue for days and it turned out to be a user level mistake (I was that user :p).

The setup was a very basic deffered setup, so the first pass was packing the gbuffer, the second shading using that gbuffer. But whilst the first pass appeared to be working when drawing to the screen it was failing when drawing to an FBO, the textures were full of garbage that could only have been random gpu data and only one patch seemed to be getting written into.

Now as I havent done that enough testing on the multi render target code I assumed that it must be broken. Some hours of digging later it wasnt looking hopeful.

I tested on my (older) laptop..and it seemed better! There was still some corruption but less and more of the model showing...weird.

This was also the first time working with half-float textures as a render target, so I assumed I had some mistakes there. More hours later no joy either.

Next I had been fairly sure viewports were involved in this bug somehow (given that some of the image looked correct) but try as I might I could not find the damn bug. I tripple checked the size of all the color textures.. and the formats and the binding unbinding in the abstrations.

Nothing. Nada. Zip

Out of desperation I eventually made an fbo and let CEPL set all the defaults except size...AND IT WORKED...what the fuck?!

I looked back at my code that initialized the FBO and finally saw it:

(make-fbo `(0 :dimensions ,dim :element-type :rgb16f)
          `(1 :dimensions ,dim :element-type :rgb16f)
          `(2 :dimensions ,dim :element-type :rgb8)
          `(3 :dimensions ,dim :element-type :rgb8)
          :d))

That :d in there is telling CEPL to make a depth attachment, and to use some sensible defaults. However it also is going to pick a size, which as a default will be the size of the current viewport *smashes face into table*

According to the GL spec:

If the attachment sizes are not all identical, rendering will be limited to the largest area that can fit in all of the attachments (an intersection of rectangles having a lower left of (0 0) and an upper right of (width height) for each attachment).

Which explains everything I was seeing.

As it is more usual to make attachments the same size I now require a flag to be set if you want attachments with different sizes along with a big ol' explanation of this issue in the error message you see if you don't set the flag.

That's all once again,

Maybe this week I'll see something that doesnt look like crap :D

p.s. As the lighting still looks like garbage the image is just the roughness map