c++ - Cómo usar Multisampling con OpenGL FBOs
(1)
Debe asignar un búfer de profundidad multiválvula para que funcione correctamente y darle la misma cantidad de muestras que su búfer de color. En otras palabras, debería llamar a glRenderbufferStorageMultisample (...)
lugar de glRenderbufferStorage (...)
.
Su FBO debe estar fallando una comprobación de integridad tal como está asignada en este momento. Una llamada a glCheckFramebufferStatus (...)
debe devolver GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE
porque su buffer de profundidad tiene exactamente 1 muestra y su adjunto de buffer de color tiene 4 .
Dado que también está utilizando un archivo adjunto de textura multimuestreado en este FBO, debe tener en cuenta las diferencias entre el muestreo de una sola muestra de textura y el multiempañado en los sombreadores GLSL.
Las texturas multimuestreadas tienen un tipo uniforme de muestreador especial ( p.ej. sampler2DMS
) y tiene que buscar explícitamente cada muestra en la textura por su coordenada de texel entera (no normalizada) e índice de muestra usando texelFetch (...)
. Esto también significa que no pueden ser filtrados o mapeados.
Probablemente no desee una textura multipantallada en este caso, probablemente desee utilizar glBlitFramebuffer (...)
para hacer la resolución MSAA en un FBO de muestra única. Si lo hace, puede leer los resultados de suavizado en sus sombreadores en lugar de tener que buscar cada muestra e implementar el suavizado usted mismo.
Estoy intentando habilitar mutlisampling y alpha-to-coverage para un FBO. Usando el framebuffer predeterminado, todo lo que tengo que hacer es llamar 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 en un FBO de la misma manera que se dibujaría en el framebuffer predeterminado con las propiedades anteriores. A partir de ahí, quiero poder usar la imagen como una textura para pases futuros a través de un sombreador.
Esto funciona : Código para hacer un FBO sin multisampling / alfa-a-cobertura, 1 adjunto de color, 1 adjunto 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 que intenta hacer un FBO multipamplificado:
// 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 buscar en el wiki de OpenGL, aunque está incompleto (varios títulos sin terminar hacen que parezca poco profesional). glGetError
nunca se queja. He intentado meterme con esto, pero o bien obtengo una pantalla negra o una pantalla llena de píxeles basura.
Pregunta principal: ¿Qué cosas debo considerar / cambiar y dónde (creación de FBO, texturas, sombreadores) para que la multimuestreo y la alfa-cobertura funcionen con un FBO?