reales - OpenGL: ¿dibujar píxeles en la pantalla?
libro de android studio en español pdf (3)
Quiero dibujar una matriz 2D de datos de píxeles (valores RGB / escala de grises) en la pantalla lo más rápido posible, usando OpenGL. Los datos de píxeles cambian con frecuencia.
Tenía la esperanza de encontrar una función simple que me permitiera insertar un puntero a una matriz que representa los datos de píxeles, ya que este es probablemente el enfoque más rápido. Desafortunadamente, no he encontrado tal función.
¿Cuál es la mejor manera de lograr esta tarea?
Creo que la manera más rápida sería dibujar un cuadrante de tamaño de pantalla con proyección orto y usar un sombreador de píxeles y un Objeto de Amortiguación de Textura para dibujar directamente a la textura en el sombreador de píxeles. Debido a la transferencia de latencia a / desde el TBO, es posible que desee ver si el doble buffer ayudaría.
Si la velocidad no es una gran preocupación (solo necesita velocidades de cuadros bastante interactivas) glDrawPixels es fácil de usar y funciona lo suficientemente bien para muchos propósitos.
Recientemente tuve un problema similar, ya que estoy tratando de mostrar un video en la pantalla (es decir, subir datos de píxeles repetidamente a la VRAM), mi enfoque es:
utilice glTexImage2D y glTexSubImage2D para cargar los datos a la textura (es decir, vincule la textura (y la unidad de textura, si corresponde) antes de llamar a eso)
en mi caso, ya que la velocidad de cuadro de video (generalmente 24 fps) es menor que la velocidad de cuadro de mi aplicación (apuntada a 60 fps), para evitar subir los mismos datos utilizo un objeto framebuffer (mire glGenFramebuffers / glBindFramebuffer / glDeleteFramebuffers) y vincula mi textura con el framebuffer (glFramebufferTexture2D). Luego cargué esa textura una vez, y dibujo el mismo marco varias veces (solo acceso normal a la textura con glBindTexture)
No sé qué plataforma está usando, pero como apunto a Mac utilizo algunas extensiones de Apple para asegurar que la transferencia de datos a la VRAM ocurra a través de DMA (es decir, haga que glTexSubImage2D regrese inmediatamente para dejar que la CPU haga otro trabajo) - por favor libre para pedirme más información si también está usando Mac
Además, como está utilizando solo escala de grises, puede considerar simplemente usar una textura GL_LUMINANCE (es decir, 1 byte por píxel) en lugar de formato basado en RGB para hacer la carga más rápido (pero eso depende del tamaño de los datos de textura, estaba transmitiendo Video de HD 1920x1080, así que necesitaba asegurarme de mantenerlo abajo)
también tenga en cuenta el formato que usa su hardware para evitar conversiones de datos innecesarias (es decir, normalmente parece mejor utilizar datos de BGRA que, por ejemplo, solo RGB)
finalmente, en mi código reemplacé toda la funcionalidad fija de la tubería con sombreadores (en particular, la conversión de los datos de escala de grises o formato YUV a RGB), pero de nuevo todo depende del tamaño de sus datos y la carga de trabajo de su CPU o GPU
Espero que esto ayude, siéntete libre de mandarme un mensaje si necesitas más información
Tal vez glDrawPixels es la función que estás buscando? Sin embargo, si la información es estática, sería mejor crear una textura con ella, y luego dibujar cada cuadro.