es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe una forma de pasar mosaicos Bayer de 24 bits a la GPU mediante OpenGL?

Estoy desarrollando una interfaz de cámara en C#.

Tengo una cámara HDR que genera imágenes RAW HDR de 24 bits.
El buffer de imagen RAW es una matriz de bytes, byte[], con 3 bytes por cada mosaico Bayer.

Estoy buscando una manera de pasar este buffer de matriz al GPU como textura mediante OpenTK (un envoltorio de OpenGL en C#). Y luego desencriptar los píxeles de imagen RAW en píxeles RGB de 24 bits, luego tonemaparlo a píxeles RGB de 8 bits.

Vi un ejemplo de código que usa el formato de píxeles de luminancia:

GL.BindTexture(TextureTarget.Texture2D, this.handle);
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Luminance, width, height, 0, PixelFormat.Luminance, PixelType.UnsignedByte, imageBuffer);
GL.BindTexture(TextureTarget.Texture2D, 0);

Pero no estoy seguro de cómo el fragment shader muestrearía este buffer de imagen con este formato de píxel en un píxel de color. No estoy seguro si esta es la forma correcta de hacerlo para un píxel de 24 bits.

También intenté la opción de crear una matriz de enteros (int[]) a partir del buffer de imagen de matriz de bytes, combinando cada 3 bytes en un int en la CPU. Pero luego me enfrento a problemas similares al pasar la matriz de enteros al GPU como textura. No estoy seguro qué formato de píxel debería aplicarse aquí.

¿Alguien podría señalarme en la dirección correcta?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para pasar el búfer de matriz de bytes a la GPU como una textura en OpenTK, se puede utilizar el formato TextureFormat.RGB. Este formato te permitirá cargar los píxeles de imagen sin procesar en una textura que se puede utilizar en tu fragment shader.

    Aquí tienes un ejemplo de cómo se puede crear una textura usando este formato:

    GL.BindTexture(TextureTarget.Texture2D, textureHandle);
    
    GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgb, width, height, 0, PixelFormat.Rgb, PixelType.UnsignedByte, imageBuffer);
    
    GL.GenerateMipmap(GenerateMipmapTarget.Texture2D);
    
    GL.BindTexture(TextureTarget.Texture2D, 0);
    

    Una vez que hayas cargado la textura, puedes desenmascarar los píxeles de imagen sin procesar en píxeles RGB de 24 bits en tu fragment shader utilizando técnicas de interpolación bilineal o vecino más cercano.

    Para asignar tonos a los píxeles RGB de 24 bits a píxeles RGB de 8 bits, se puede utilizar un algoritmo de asignación de tonos como Reinhard, Hable, o ACES. Estos algoritmos se pueden implementar en tu fragment shader para convertir la imagen HDR en una imagen de rango dinámico bajo (LDR).

    En general, utilizando el formato TextureFormat.RGB y aplicando algoritmos de asignación de tonos en tu fragment shader, deberías ser capaz de pasar el búfer de imagen sin procesar a la GPU y convertirlo en una imagen visualizable.

Comments are closed.