He visto mucho material sobre este tema, pero hay algunas diferencias entre los ejemplos que he encontrado y me está costando obtener una comprensión sólida del proceso correcto. Con suerte, alguien me puede decir si estoy en el camino correcto. También debería mencionar que estoy haciendo esto en OS X Leopard y la última versión de Xcode 3.Configuración de OpenGL Multiple Render Targets
Por el bien de ejemplo, digamos que quiero escribir a dos objetivos, uno para normal y otro para el color . Para ello he crear un uso de este dispositivo y se unen dos texturas a la misma, así como la profundidad de textura:
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 pronunciar, me enlazar el uso de este dispositivo de nuevo y luego hacer:
GLenum buffers[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT };
glDrawBuffers(2, buffers);
Esto haría significa que las llamadas al sorteo 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 entonces hacer 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?
Gracias por la respuesta! Era más una cuestión de aseguramiento para asegurarme de que no estaba asignando cosas que no necesitaba, y que el orden se veía bien. ¿El uso de un renderbuffer en lugar de una textura ofrece algún beneficio de rendimiento? – TaylorP
@TaylorP No lo sé, probablemente no. –
Sé que es una vieja pregunta. Pero sí, usar un buffer de representación obtendrá un rendimiento en comparación con el uso de una textura. Como un buffer de render puede aprovechar formas más optimizadas de almacenar los datos y procesos para manejar las operaciones de dibujo. – Vallentin