opengl framebuffer

Configuración de múltiples objetivos de renderizado OpenGL



framebuffer (1)

He visto mucho material sobre este tema, pero hay algunas diferencias entre los ejemplos que he encontrado y estoy teniendo dificultades para obtener una comprensión sólida del proceso correcto. Con suerte, alguien me puede decir si estoy en el camino correcto. También debo mencionar que estoy haciendo esto en OS X Snow Leopard y la última versión de Xcode 3.

Por el bien del ejemplo, digamos que quiero escribir en dos objetivos, uno para normal y otro para el color. Para hacer esto, creo un framebuffer y le ato dos texturas, así como una textura de profundidad:

glGenFramebuffersEXT(1, &mFBO); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO); glGenTextures(1, &mTexColor); glBindTexture(GL_TEXTURE_2D, mTexColor); //<texture params> glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, mTexColor, 0); glGenTextures(1, &mTexNormal); glBindTexture(GL_TEXTURE_2D, mTexNormal); //<Texture params> glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, mTexNormal, 0); glGenTextures(1, &mTexDepth); glBindTexture(GL_TEXTURE_2D, mTexDepth); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, w, h, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL); glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, mTexDepth, 0); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0)

Antes de renderizar, vincularía el framebuffer nuevamente y luego:

GLenum buffers[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT }; glDrawBuffers(2, buffers);

Esto significaría que las llamadas al sorteo adicionales atraerían a mi framebuffer. (¿Creo?)

Luego configuraba mis sombreadores y dibujaba la escena. En mi sombreador de vértices procesaría las normales / posiciones / colores como de costumbre, y pasaría los datos al sombreador de fragmentos. El fragmento luego haría algo como:

gl_FragData[0] = OutputColor; gl_FragData[1] = OutputNormal;

En este punto, debería tener dos texturas; uno con colores de todos los objetos renderizados y uno con normales. ¿Todo esto es correcto? Ahora debería ser capaz de usar esas texturas como cualquier otra, por ejemplo renderizarlas en un quad de pantalla completa, ¿verdad?


Suena y parece razonable. Esta es de hecho la forma común de hacerlo. Si no necesita los datos de profundidad como textura para un procesamiento posterior, también puede usar un buffer de representación para un archivo adjunto, pero una textura también debería funcionar bien.

También puede usar glCheckFramebufferStatusEXT después de que glCheckFramebufferStatusEXT finalizado la instalación, para ver si el framebuffer es válido en su configuración actual, pero su código se ve bien. Si no tienes un problema y esto solo fue para asegurarte, puedes estar seguro de que estás en el camino correcto; de lo contrario, cuéntanos qué ocurre.