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.
- Android poco convencional y desagradable durante el código de carga de JNI / OpenGL ES
- ¿Por qué la muestra de documentación se divide por 2 para calcular inSampleSize para la carga de mapa de bits?
- Mover la cámara alrededor de la esfera
- Cómo grabar la pantalla de actividad de la webview con Android MediaCodec?
- ¿Por qué eclipsar mi textura con el color?
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.
- Uso de la clase GLSurfaceView con diseños xml para Android
- Tamaño de textura mínimo requerido para el cumplimiento con OpenGL-ES 2.0 en Android?
- Problema de renderizado de malla libgdx
- ¿Puede OpenGL ES renderizar texturas de dimensiones no básicas 2?
- Android GLSurfaceView
- Problemas con la cámara OpenGL ES 2.0
- Aplicación de efectos en el video que se está reproduciendo
- Android - OpenGL ES 2.0: Emulador (Works) - Dispositivo (no)
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.