2012-03-25 12 views
11

son glTexImage2D y glTexSubImage2D las únicas formas de pasar un búfer de píxeles a una textura?Actualización de una textura en OpenGL con glTexImage2D

En el momento en que su uso en una función de configuración glTexImage2D pasar null como el buffer, y luego en el bucle de render me llaman glTexSubImage2D con los nuevos datos del buffer en cada iteración.

Pero sabiendo que la textura no cambiará ninguna propiedad como las dimensiones, ¿hay alguna manera más eficiente de pasar los datos de píxeles reales a la textura de renderizado?

Respuesta

23

En la moderna OpenGL hay 4 métodos diferentes para actualizar las texturas 2D:

1) glTexImage2D - el más lento, recrea estructuras de datos internas.

2) glTexSubImage2D - un poco más rápido, pero no puede cambiar los parámetros (tamaño, formato de píxel) de la imagen.

3) Renderizar-texturizar con FBO - actualizar la textura completamente en la GPU, muy rápido. Consulte esta respuesta para obtener más detalles: https://stackoverflow.com/a/10702468/1065190

4) Objeto de memoria intermedia de píxeles PBO - para cargas rápidas desde la CPU a la GPU, aún no admitidas (todavía) en OpenGL ES.

+0

Veo que FBO sería la mejor opción, pero mis texturas necesitan usar el parámetro GL_LUMINANCE y descubrí que las FBO no son compatibles. Entonces, ¿la única opción para usar glTexSubImage2D? – PerracoLabs

+0

¿Utiliza el escritorio OpenGL o OpenGL ES? –

+0

usando OpenGL ES en Android. La razón para usar GL_LUMINANCE es que debo pasar los datos de YUV420sp a un sombreador, para hacer 2 llamadas a glTexSubImage2D para pasar 2 planos, uno para Y y otro para UV. y por lo tanto tengo que usar GL_LUMINANCE. la opción de convertir YUV en RGB antes de pasar los datos al sombreador no es una opción por razones de velocidad. – PerracoLabs

Cuestiones relacionadas