PDA

View Full Version : Sample Independent Blending onto Multisampled Framebuffer



Kastenfrosch2
09-04-2012, 07:24 AM
I draw a triangle to a Multisample Texture without blending.
Then i draw another triangle to the same buffer with alpha blending.
Then i extract only subsample 0 to my final image
In the results it looks like the subsamples are not blended together independently (see the undesired anti-aliasing for each subsample in the following images)


865

Is this expected behavior? Isn't it said in the documentation that blending should be done independently for every sample?!

I have a GeForce GTX 560 and use the newester driver (301.42) (tried it before with a 29x.xx version)

Edit: Tried it with a Radeon Card and there the blending is correctly done sample-independently.
Does this seem to be a Driver-Bug or is it more likely, that i introduced undefined behaviour anywhere (the provided code that follows this post is almost the whole program code)

(My Code is embeded in a freeglut project using glew with an 4.2 compatibility context)

Initialization of the Framebuffer:


glGenFramebuffers(1,&fbo);
glGenTextures(1, &texMS);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE,texMS);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 2 ,GL_RGBA, windowWidth, windowHeight,true);

glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, texMS,0);


Drawing of Geometry


glEnable(GL_MULTISAMPLE);

glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glDrawBuffer(GL_COLOR_ATTACHMENT0);

glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1,1,-1,1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glUseProgram(0);
glBegin(GL_TRIANGLES);
glColor4f(0.0,0.0,1.0,0.5);
glVertex2f(-1.0,-1.0);
glColor4f(0.0,1.0,1.0,0.5);
glVertex2f(1.0,-0.7);
glColor4f(1.0,1.0,1.0,0.5);
glVertex2f(0.5,1.0);
glEnd();

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.1,0.05,0.0);

glUseProgram(0);

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glBegin(GL_TRIANGLES);
glColor4f(1.0,0.0,0.0,0.5);
glVertex2f(-1.0,-1.0);
glColor4f(1.0,1.0,0.0,0.5);
glVertex2f(1.0,-0.7);
glColor4f(1.0,0.0,1.0,0.5);
glVertex2f(0.5,1.0);
glEnd();

glDisable(GL_BLEND);



Fragment Shader that extracts sample 0 (drawn as a fullscreen quad)


#version 330
out vec4 myPixelColor;
uniform sampler2DMS tex;

void main()
{
myPixelColor.rgb = texelFetch(tex, ivec2(gl_FragCoord.xy), 0).rgb;
myPixelColor.a = 1.0;
}


Am i missing something?

Kastenfrosch2
09-05-2012, 04:47 AM
OK, i tried the NVidia 306.02 Beta Driver and my minimal-Example (that i posted above) now works.
So i guess it's just a Bug in the NVidia drivers.

However if i change the Multisample-Texture's internal format to SRGB8_ALPHA8, the bug still persists.
Strange....