2011-08-26 18 views
22

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?

Respuesta

10

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 realizar la configuració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.

+0

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

+0

@TaylorP No lo sé, probablemente no. –

+2

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