PDA

View Full Version : MRT + multisampling only 1 of the RT's



havokentity
04-10-2008, 02:13 AM
Hello,

Does anyone know how to multi sample only the FIRST color attachment of a multiple color attachment FBO.

Thanks in advance.

PS: Whenever I do this, I get the first color attachment's pixel's
in the second color attachment. But obviously working fine without MSAA.

Zengar
04-10-2008, 06:11 AM
All attachements of a FBO must have the same sample count.

havokentity
04-10-2008, 07:09 AM
What I do is, I create a regular FBO with a few color attachments. It works fine. I create another FBO (for MSAA), and create the same number of renderbuffers. I multisample using the glBlitFramebufferEXT function. But somehow the second color attachment gets the first color attachments image.

My procedure is like this:

glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, fbo.getFBO());

glBlitFramebufferEXT(0, 0, this->mWidth, this->mHeight, 0, 0, this->mWidth, this->mHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR);

-NiCo-
04-10-2008, 07:45 AM
I multisample using the glBlitFramebufferEXT function.

Perhaps you're not aware of how multisampling works. In order to have a multisampled result, you should render your scene in the multisampled FBO. If you're rendering into the single sample FBO and then blit this one into the multisample FBO, it will replicate the value of the single sample FBO to all samples in the multisample FBO. In this case, there's no benefit in having a multisample FBO since, after resolving it to display on screen, you will get exactly the same result as the single sample FBO.

FYI, when blitting from/to MRT targets you also need to specify the attachments you're reading from and blitting to with glReadBuffer and glDrawBuffer.

havokentity
04-10-2008, 07:55 AM
Hello Nico,

Yes, I'm doing the multisampling the way you told already. Right now, I'm setting glDrawBuffer with the color attachments, but I haven't done so for glReadBuffer, since I'm only drawing in the FBO, I'll only need to set glDrawBuffer right?

-NiCo-
04-10-2008, 08:03 AM
Blitting means that you read values from one framebuffer and write them to another (or the same) one. So you need to specify both the attachment you're reading from and writing to:

e.g.

glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, readfbo.getFBO());
glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, drawfbo.getFBO());
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);

glBlitFramebufferEXT(0, 0, this->mWidth, this->mHeight, 0, 0, this->mWidth, this->mHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR);

havokentity
04-10-2008, 08:15 AM
I'm using the same FBO for the blitting. My read buffer is color attachment 0 and my draw buffer is actually set using glDrawBuffers because of the multiple color attachments (I've put 2 color attachments), my first attachment is fine, but my second now, is all black.

Should I set the read and draw buffers to only the zero eth color attachment?

havokentity
04-10-2008, 08:31 AM
I'll just dive into this a bit for a while, and post if I still don't get it. If I get it working, I'll post how I got it working. But as always, any suggestions are welcome

havokentity
04-10-2008, 09:55 AM
The Multiple color attachments are working with MSAA now. The problem was that the Draw buffers weren't appropriately set.

But now I still have an issue, I'm unable to Multisample the color attachment 0 alone. OpenGL is multisampling both color attachments.

I tried using only the color attachment 0 and blitting with GL_LINEAR, and then using only color attachment 1 and blitting with GL_NEAREST to disable MSAA, but this doesn't seem to work.

Why is that? Is there anything I'm doing wrong? Or should I just draw to an un multisampled FBO and then blit it into a MSAA fbo and do the same as mentioned above? But I doubt if that will work.

Anyway answers are welcome!

Thanks in advance

-NiCo-
04-10-2008, 10:13 AM
I've read your posts over and over and I'm still confused about what you're trying to do...


The Multiple color attachments are working with MSAA now...

If you're talking about MSAA I'm assuming you created the color attachments using glRenderbufferStorageMultisampleEXT(), right?



But now I still have an issue, I'm unable to Multisample the color attachment 0 alone. OpenGL is multisampling both color attachments.

I tried using only the color attachment 0 and blitting with GL_LINEAR, and then using only color attachment 1 and blitting with GL_NEAREST to disable MSAA, but this doesn't seem to work.


GL_LINEAR and GL_NEAREST are filtering modes, they have nothing to do with MSAA at all.

havokentity
04-10-2008, 12:09 PM
Hey NickelCobalt :D,

First off, thanks a ton for re reading my posts, I really appreciate that,

onwards to the post,

Sorry man, I'm finding it a bit difficult putting down what I'm doing into words.

Ok, lets assume that MSAA works fine with a 2 color attachment FBO.
Now I'm not making a deferred renderer a such yet. But in the event I was building one, I'd need the normal data etc in the other color attachments not MSAA'd right? But right now, the 2nd color attachment is getting MSAA'd with the first. For me,

0th Color attachment contains the scene (colors),
1st Color attachment contains eyespace distances (only R component)

The deal is, I'm trying to MSAA the 0th Color attachment Alone,
and at the same time get the second color attachment un-changed (Not MSAA'd), I want to do this without any fancy stuff, multiple FBO's etc. Is it impossible? Or am I just doing something totally wrong?

-NiCo-
04-10-2008, 12:27 PM
Well, like Zengar said, all attachments in an FBO must have the same sample count. So if your FBO is multisampled, you 2nd color attachment needs to be multisampled too. If you're doing deferred rendering than you will need to access the data in the 2nd attachment in a subsequent pass, meaning that it has to be converted into a single sample texture first. This in turn means that you need a separate texture to store the single sample version. Resolving the 2nd attachment to a single sample texture is easily done by binding the single sample texture to another FBO and blitting th 2nd attachment into that FBO. Don't be afraid of using multiple FBO's, they're just objects that keep track of whats being attached to them, etc. so they don't take up much space.

Correct me if I'm wrong, but aren't most deferred rendering techniques based on processing single sample data and then drawing the result of the final shader pass into a multisample buffer?

havokentity
04-10-2008, 12:38 PM
Thanks a ton man!

That cleared up stuff for me. Well your right about deferred rendering techniques, but actually I was trying this with Screen Space AO, and I needed some data untouched in the 2nd color attachment and I needed it in that pass itself and I needed the scene rendered multi sampled though. Ofcourse the obvious workaround was there, as is in deferred rendering but I was just curious about this, and I didn't quite follow what Zengar said about same sample counts. I now understand what he meant. I wanted to play around with multisampled scene data with un multisampled 'other' data at the same time in a post process.

Anyway, Its very clear now. I must've been high on disorder thinking about my System Software lab exams tomorrow.

Thanks again NiCo
and Zengar

-NiCo-
04-10-2008, 12:54 PM
Glad I could help. Good luck with your exams tomorrow :)