Configurando objetivos de renderizado múltiple OpenGL

He visto una gran cantidad de material sobre este tema, pero hay algunas diferencias entre los ejemplos que he encontrado y me está costando mucho entender el proceso correcto. Espero que alguien pueda decirme 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 de ejemplo, digamos que quiero escribir en dos objetivos, uno para normal y otro para color. Para hacer esto, creo un framebuffer y le agrego 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)

ntes de renderizar, volvería a vincular el framebuffer y luego haría:

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

Esto significaría que las llamadas adicionales se dibujarían en mi framebuffer. (¿Yo creo que?

Luego configuraba mis sombreadores y dibujaba la escena. En mi sombreador de vértices procesaría normales / posiciones / colores como de costumbre, y pasaría los datos al sombreador de fragmentos. El fragmento entonces 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 otro con normales. ¿Es todo esto correcto? Ahora debería poder usar esas texturas como cualquier otra, digamos renderizarlas en un quad de pantalla completa, ¿verdad?

Respuestas a la pregunta(1)

Su respuesta a la pregunta