2010-10-28 14 views
15

estoy usando un dispositivo Android con Froyo que soporte OpenGL ES 1.1 y OpenGL ES 2.0Android OpenGL ES Framebuffer - Representación profundidad de búfer a la textura

Quiero hacer que el buffer de profundidad a una textura. Después de ver una serie de ejemplos de OpenGL, OpenGL ES en otras plataformas (incluido iPhone), he intentado varias configuraciones de FBO.

Parece que puedo obtener una configuración de FBO con una textura de color, pero cada vez que adjunto una textura de profundidad falla.

Mi código actual se basa en this example pero también crea una textura de color en lugar de configurar y dibujar búferes en ninguno.

¿Hay un ejemplo simple de configuración de un FBO de OpenGL ES en Android para procesar la profundidad de una textura? Alternativamente, ¿hay algún documento que describa qué es y qué no es compatible?


Gracias por los comentarios - Necesitaba específicamente una solución para ES 1.1, si se podía encontrar y funcionaba en Android. También quiero ver ES 2 - No estoy seguro de entender la idea de incluir la información de profundidad en el buffer de color - ¿tiene alguna referencia que pueda ver para entender mejor la idea?

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


Gracias por la sugerencia fragmento shader - Ya tengo la idea. Veremos eso si no puedo conseguir otra solución funcionando. Mi ideal es obtener profundidad y color al mismo tiempo; no quiero renderizar el color y la profundidad por separado si puedo evitarlo.

+1

Sin poder comentar directamente el soporte de Android para la conexión de búfer de profundidad (y por lo tanto no puede proporcionar una respuesta real), si está dispuesto a confiar en ES 2.0, entonces una solución es empacar información de profundidad en un búfer de color y luego descomprímalo en el momento relevante. La profundidad homogénea está siempre en el rango de 0 a 1, por lo que un esquema de punto fijo no es demasiado problemático. – Tommy

+0

Debe publicar el código. Cuando falla, ¿qué significa? Genera un error GL? ¿Cuál es el estado de Framebuffer? –

+0

Para empacar la profundidad en un búfer de color, simplemente crea un sombreador de fragmentos que escribe la posición Z de un fragmento en el canal de color.Si está usando Windows y quiere un ejemplo, descargue RenderMonkey y juegue con él, estoy bastante seguro de que uno de los ejemplos lo hará. –

Respuesta

16

OK, una respuesta de géneros. Consiguió que esto funcione 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 las instrucciones de OpenGL ES2 y hacer todo en el orden correcto.

Probé esto con OpenGL ES 1.1, agregando OES a las llamadas de función requeridas y _OES a las constantes ya que los objetos de búfer de cuadro son una extensión. Cualquier intento de adjuntar una textura de profundidad a la memoria intermedia de trama da como resultado un objeto de cuadro intermedio incompleto.

Por el 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 verla.

+0

Cuando se trata de ES 1.1 he encontrado ejemplos que usan el buffer de representación para profundidad, no una textura. – NebulaFox

+0

Tenga en cuenta que en Lollipop +, puede ser necesario crear primero un contexto GL y hacerlo actual, antes de cualquier código GL fuera de pantalla; de lo contrario, todas las llamadas GL darán un código de error. Antes de Lollipop, el contexto interno del marco estaba activo cuando se llamaba el código de la aplicación. (No es un problema para GL en pantalla, porque en el momento en que se adjunta la vista a la pantalla, se crea un contexto). Todavía estoy tratando de encontrar una manera fácil de crear ese contexto ... – ToolmakerSteve

0

En muchos dispositivos no se admite el renderizado con una textura de profundidad. Tendrá que adjuntar un buffer de representación para su buffer de profundidad.

+0

Gracias, eso es útil para saber ¿Puede proporcionar algún código o un enlace sobre cómo "adjuntar un buffer de representación para su memoria intermedia de profundidad"? (Sin tal detalle, esto sería mejor como un comentario sobre la respuesta existente, en lugar de una respuesta separada.) – ToolmakerSteve

Cuestiones relacionadas