Android OpenGL ES Objetos Framebuffer – renderizado depth-buffer to texture

Estoy utilizando un dispositivo Android con Froyo que soporta OpenGL ES 1.1 y OpenGL ES 2.0

Quiero hacer el buffer de profundidad a una textura. Habiendo visto una serie de ejemplos para OpenGL, OpenGL ES en otras plataformas (incluido el iPhone) he probado varias configuraciones FBO.

Parece ser capaz de obtener un FBO set-up con una textura de color, pero cada vez que adjunto una textura de profundidad no.

Mi código actual se basa en este ejemplo pero también crea una textura de color en lugar de establecer buffers de dibujo y lectura a ninguno.

¿Existe un ejemplo sencillo de configuración de OpenGL ES FBO en Android para dar profundidad a una textura? ¿También existe un documento que describe lo que está y no está soportado?


Gracias por los comentarios – Yo específicamente necesitaba una solución para ES 1.1, si se podía encontrar y trabajar en Android. También quiero mirar ES 2 – No estoy seguro de entender la idea de embalar la información de profundidad en el búfer de color – ¿tiene una referencia que puedo mirar para entender mejor la idea?

En cuanto al código – mi fuente es apenas diferente del enlace que posteé anteriormente. El estado Framebuffer es que no está completo.


Gracias por la sugerencia fragmento shader – tengo la idea ahora. Se verá que si no puedo conseguir otra solución de trabajo. Mi ideal es obtener profundidad y color al mismo tiempo – realmente no quiero hacer el color y la profundidad por separado si puedo ayudarlo.

OK, una especie de respuesta. Tengo esto para trabajar en Android 2.2 con OpenGL ES 2:

// Create a frame buffer glGenFramebuffers( 1, &(frame_buffer ) ); // Generate a texture to hold the colour buffer glGenTextures(1, &(colour_texture) ); glBindTexture(GL_TEXTURE_2D, colour_texture); // Width and height do not have to be a power of two glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pixelWidth, pixelHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // Probably just paranoia glBindTexture(GL_TEXTURE_2D, 0); // Create a texture to hold the depth buffer glGenTextures(1, &(depth_texture) ); glBindTexture(GL_TEXTURE_2D, depth_texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, pixelWidth, pixelHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glBindTexture(GL_TEXTURE_2D, 0); glBindFramebuffer(GL_FRAMEBUFFER, frame_buffer); // Associate the textures with the FBO. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colour_texture, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth_texture, 0); // Check FBO status. GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); if ( status == GL_FRAMEBUFFER_COMPLETE ) { // Success } 

Bastante trivial realmente, siga el manual de OpenGL ES2 y haga todo en el orden correcto.

Intentado esto con OpenGL ES 1.1, agregando OES a las llamadas de función requeridas y _OES a las constantes puesto que los objetos del almacenador intermediario del marco son una extensión. Cualquier intento de adjuntar una textura de profundidad al búfer de trama da como resultado un objeto de búfer de trama incompleto.

Así que en este momento mi conclusión es que esto no funciona con OpenGL ES 1.1 en Android, pero claramente funciona con ES 2.2.

Si alguien tiene una solución para ES 1.1, sería interesante verlo.

La renderización a una textura de profundidad no es compatible con muchos dispositivos. Deberá adjuntar un renderbuffer para su buffer de profundidad.

  • Mapeando una textura en un cuadrado: ¿Por qué se rota la imagen?
  • No se puede encontrar el ejemplo adecuado para la clase de sprite de OpenGL 2d que no usa GL11Ext para dibujar
  • Zoom in OpenGL ES 2.0 - desapareciendo objeto
  • ¿Qué tipo de efectos secundarios tiene libgdx numSamples?
  • ¿Hay algún dispositivo Android con un tamaño de pantalla mayor que GL_MAX_TEXTURE_SIZE?
  • Android OpenGL Effectfactory, cómo aplicar múltiples efectos?
  • Diferencia entre glOrthof y glViewPort
  • Java.lang.ClassNotFoundException: android.view.GLSurfaceView
  • Procesamiento de vídeo en Android 3.x / Google TV / SDK: Marco de vídeo a SurfaceTexture / OpenGL / GLSL
  • OpenGL ES 2.0 artefactos / dithering en FBO en Mali-400
  • Esfera 3D OpenGL
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.