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!
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
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). –