2009-10-30 24 views
7

Estoy tratando de renderizar una textura, luego dibujar esa textura en la pantalla usando OpenGL ES en el iPhone. Estoy usando this question como punto de partida y haciendo el dibujo en una subclase de la demostración EAGLView de Apple.OpenGL ES renderizar para texturizar, luego dibujar texturas

Las variables de instancia:

GLuint textureFrameBuffer; 
Texture2D * texture; 

para inicializar la memoria intermedia de trama y la textura, que estoy haciendo esto:

GLint oldFBO; 
glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &oldFBO); 

// initWithData results in a white image on the device (works fine in the simulator) 
texture = [[Texture2D alloc] initWithImage:[UIImage imageNamed:@"blank320.png"]]; 

// create framebuffer 
glGenFramebuffersOES(1, &textureFrameBuffer); 
glBindFramebufferOES(GL_FRAMEBUFFER_OES, textureFrameBuffer); 

// attach renderbuffer 
glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, texture.name, 0); 

if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) 
    NSLog(@"incomplete"); 

glBindFramebufferOES(GL_FRAMEBUFFER_OES, oldFBO); 

Ahora, si yo simplemente dibujar mi escena a la pantalla como de costumbre, funciona bien:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
// draw some triangles, complete with vertex normals 
[contentDelegate draw]; 
[self swapBuffers]; 

Pero, si me hacen a 'textureFrameBuffer', luego dibujar 'textura' de la pantalla, el im resultante la edad está al revés y "al revés". Es decir, parece que las normales de los objetos 3D apuntan hacia adentro en lugar de hacia afuera: la cara frontal de cada objeto es transparente y puedo ver el interior de la cara posterior. Aquí está el código:

GLint oldFBO; 
glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &oldFBO); 

glBindFramebufferOES(GL_FRAMEBUFFER_OES, textureFrameBuffer); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

// draw some polygons 
[contentDelegate draw]; 

glBindFramebufferOES(GL_FRAMEBUFFER_OES, oldFBO); 

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glEnable(GL_TEXTURE_2D); 
glColor4f(1, 1, 1, 1); 
[texture drawInRect:CGRectMake(0, 0, 320, 480)];  
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glDisable(GL_TEXTURE_2D); 

[self swapBuffers]; 

puedo voltear la imagen rightside en marcha con bastante facilidad mediante la reordenación de la (glTexCoordPointer) coordina en consecuencia (en el método drawInRect de Texture2D), pero eso no resuelve el problema "dentro-fuera".

Intenté reemplazar la textura Texture2D con una textura OpenGL creada manualmente, y el resultado fue el mismo. Dibujar un Texture2D cargado desde una imagen PNG funciona bien.

En cuanto al dibujo de los objetos, cada vértice tiene una unidad normal especificada, y GL_NORMALIZE está habilitado.

glVertexPointer(3, GL_FLOAT, 0, myVerts); 
glNormalPointer(GL_FLOAT, 0, myNormals); 
glDrawArrays(GL_TRIANGLES, 0, numVerts); 

Todo dibuja bien cuando se procesa en la pantalla; GL_DEPTH_TEST está habilitado y funciona de maravilla.

¿Alguna sugerencia sobre cómo solucionarlo? ¡Gracias!

+0

Para el problema de "adentro hacia afuera": si se seleccionan las primitivas frontales, entonces tiene un problema con el ordenamiento de vértices, que se usa para determinar la faceta normal. No es un problema con la textura, a menos que esté malinterpretando algo. ¿Tienes habilitado GL_CULL_FACE? – prideout

+0

GL_CULL_FACE no estaba habilitado. Permitirlo definitivamente mejora la apariencia general. Las normales del objeto parecen ser la salida correcta ahora, pero ahora se ven muchas caras delanteras que deberían ocultarse, independientemente de si están (o más bien deberían ser) oscurecidas por otra cara. ¿Eso indica un problema con el devanado de mis triángulos? Estoy usando un script para exportar vértices desde Blender; Me aseguraré de que el bobinado sea uniforme cuando se exporta. Tenga en cuenta que todo se ve perfecto cuando dibujo directamente en la pantalla (y que GL_CULL_FACE esté activado o desactivado no hace diferencia). –

Respuesta

3

La parte interesante de esto es que está viendo un resultado diferente al dibujar directamente en el backbuffer. Ya que está en la plataforma de iPhone, está siempre dibujando en un FBO, incluso cuando está dibujando en el backbuffer.

Asegúrese de tener un búfer de profundidad conectado a su FBO fuera de pantalla. En el código de inicialización, es posible que desee agregar el siguiente fragmento justo después del glBindFramebufferOES (...).

// attach depth buffer 
GLuint depthRenderbuffer; 
glGenRenderbuffersOES(1, &depthRenderbuffer); 
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer); 
glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, width, height); 
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer); 
+0

Puede estar en algo, pero todavía no funciona ... Después de hacer eso y adjuntar la textura (como antes), glCheckFramebufferStatusOES (GL_FRAMEBUFFER_OES) devuelve GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES. ¿El frameBuffer necesita un buffer de color adjunto a él también? (Intenté eso rápidamente, sin suerte todavía, pero lo seguiré haciendo.) Gracias por su ayuda, de verdad, realmente lo aprecio. –

+0

Oh, quise agregar esa representación al backbuffer, luego copiar en mi imagen usando glCopyTexSubImage2D y luego mostrar la imagen funciona (todo dibuja como debería), es terriblemente lento. Volviendo a averiguar qué pasa con mi buffer ... –

+0

Interesante. Sí, también necesita adjuntar un buffer de color. Por cierto, esto no está relacionado, pero es posible que desee asegurarse de que su objeto de textura tenga un tamaño de potencia de dos para que funcione con iPhones anteriores. ¡Buena suerte! – prideout

Cuestiones relacionadas