c++ - transmite - ¿Puedo usar una imagen en escala de grises con la función glTexImage2D de OpenGL?
que transmite una fotografia en blanco y negro (2)
Tengo una textura que tiene solo 1 canal, ya que es una imagen en escala de grises. Cuando paso los píxeles a glTexImage2D, sale en rojo (obviamente porque el canal 1 es rojo, RGB).
glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGBA,
dicomImage->GetColumns(), dicomImage->GetRows(),
0, GL_RGBA, GL_UNSIGNED_BYTE, pixelArrayPtr);
¿Cambio GL_RGBA? Si es así, ¿qué?
Cámbielo a GL_LUMINANCE. Ver http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/teximage2d.html
Parece que debería usar GL_LUMINANCE
lugar de GL_RGBA
para el tercer argumento.
Editar (en respuesta a los comentarios):
Cuando establezco el 7mo argumento en GL_LUMINANCE
(así como en el 3er), la imagen se distorsiona por completo. Con el formato de píxel DICOM, parece que el séptimo argumento debe ser GL_RGBA
por algún motivo.
El comportamiento extraño es porque estoy usando el estándar DICOM . El lector DICOM particular que estoy usando genera valores de píxel enteros (ya que los valores de píxel pueden exceder el máximo normal de 255). Por alguna extraña razón, la combinación de decirle a OpenGL que estoy usando un formato RGBA, pero al pasar en valores enteros, obtuve una imagen perfecta.
Como estaba truncando los valores de DICOM> 255 píxeles de todos modos, me pareció lógico copiar los valores en una matriz GLbyte. Sin embargo, después de hacerlo, se produjo un SIGSEGV (error de segmentación) al llamar a glTexImage2D
. Al cambiar el séptimo parámetro a GL_LUMINANCE
(como normalmente se requiere), la funcionalidad volvió a la normalidad.
¿Extraño eh?
Entonces, una nota para todos los desarrolladores que usan el formato de imagen DICOM: Necesitas convertir la matriz entera a una matriz char antes de pasarla a glTexImage2D
, o simplemente establecer el 7mo argumento a GL_RGBA
(la última probablemente no sea recomendada).