Cómo usar Multisampling con OpenGL FBOs


Estoy tratando de habilitar mutlisampling y alpha-to-coverage para un FBO. Usando el framebuffer predeterminado, todo lo que tengo que hacer es llamar a glEnable(GL_MULTISAMPLE) y glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE). Sin embargo, no puedo lograr el mismo efecto usando mi propio FBO.

Mi objetivo: Dibujar la escena a un FBO de la misma manera que se dibujaría al framebuffer predeterminado con las propiedades anteriores. A partir de ahí quiero poder utilizar la imagen como una textura para futuros pases a través de un sombreador.

Esto funciona : Código para hacer un FBO sin multisampling / alfa-a-cobertura, 1 accesorio de color, 1 accesorio de profundidad:

// Generate the color attachment
glGenTextures(1,&defaultColorAttachment0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,defaultColorAttachment0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,screenWidth,screenHeight,0,GL_RGBA,GL_UNSIGNED_BYTE,NULL);

// Bind the texture to the FBO
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, defaultColorAttachment0,0);

// Generate the depth attachment
glGenRenderbuffers(1,&defaultDepthBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, defaultDepthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, screenWidth, screenHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, defaultDepthBuffer);

Esto no funciona. Código intentando hacer un FBO multisampleado:

// Generate the color attachment
glGenTextures(1,&defaultColorAttachment0);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, defaultColorAttachment0);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA, screenWidth, screenHeight, GL_FALSE);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, defaultColorAttachment0,0);

// Generate the depth attachment
glGenRenderbuffers(1,&defaultDepthBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, defaultDepthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, screenWidth, screenHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, defaultDepthBuffer);

He intentado mirar a través del wiki de OpenGL sobre esto, aunque está incompleto (varios encabezados inacabados lo hacen parecer poco profesional). glGetError nunca se queja. He intentado jugar con esto, pero o tengo una pantalla negra o una pantalla llena de píxeles basura.

Principal Pregunta: ¿Qué cosas necesito considerar/cambiar y dónde (creación de FBO, texturas, sombreadores) para obtener multisampling y alfa-a-cobertura para trabajar con un FBO?

Author: genpfault, 2013-12-10

1 answers

Necesita asignar un búfer de profundidad multiampleado para que esto funcione correctamente y darle el mismo número de muestras que su búfer de color. En otras palabras, deberías estar llamando glRenderbufferStorageMultisample (...) en lugar de glRenderbufferStorage (...).

Su FBO debería estar fallando en una comprobación de integridad de la forma en que se asigna en este momento. Una llamada a glCheckFramebufferStatus (...) debe devolver GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE porque su búfer de profundidad tiene exactamente 1 muestra y su accesorio de búfer de color tiene 4.


Dado que también está utilizando un archivo adjunto de textura multisampled en este FBO, debe tener en cuenta las diferencias entre el muestreo de una textura de muestra única y el multisampled en sombreadores GLSL.

Las texturas Multisampled tienen un tipo uniforme de sampler especial ( e. g. sampler2DMS) y tienes que buscar explícitamente cada muestra en la textura por su entero (no normalizado) texel coordenada e índice de muestra usando texelFetch (...). Esto también significa que no pueden ser filtrado o mapeado mip.

Probablemente no desee una textura multisampleada en este caso, probablemente desee usar glBlitFramebuffer (...) para hacer la resolución MSAA en un FBO de muestra única. Si hace esto en su lugar, puede leer los resultados de suavizado en sus sombreadores en lugar de tener que buscar cada muestra e implementar el suavizado usted mismo.

 23
Author: Andon M. Coleman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-19 16:22:50