¿Puedo utilizar una imagen en escala de grises con la función OpenGL glTexImage2D?

StackOverflow https://stackoverflow.com/questions/680125

  •  22-08-2019
  •  | 
  •  

Pregunta

Tengo una textura que tiene sólo 1 canal, ya que es una imagen en escala de grises. Cuando paso los píxeles en al glTexImage2D, sale rojo. (Obviamente porque el canal 1 es de color rojo; RGB)

glTexImage2D(
    GL_TEXTURE_2D, 0, GL_RGBA,
    dicomImage->GetColumns(), dicomImage->GetRows(),
    0, GL_RGBA, GL_UNSIGNED_BYTE, pixelArrayPtr);

puedo cambiar GL_RGBA? Si es así, qué?

Otros consejos

Parece que debo utilizar en lugar de GL_LUMINANCE GL_RGBA para la tercera argumento.

Editar (en respuesta a los comentarios):

Cuando me puse el séptimo argumento para GL_LUMINANCE (así como la tercera), la imagen va completamente distorsionada. Con el formato de píxeles DICOM, parece que el séptimo argumento debe ser GL_RGBA por alguna razón.

El extraño comportamiento se debe a que estoy usando el estándar DICOM . El lector DICOM particular, estoy usando salidas de valores de píxeles enteros (como valores de píxel pueden exceder el máximo normal de 255). Por alguna extraña razón, la combinación de OpenGL diciendo que estoy usando un formato RGBA, pero que pasa en valores enteros prestado una imagen perfecta.

Debido a que estaba truncar los valores de los píxeles DICOM> 255 de todos modos, parecía lógico para copiar los valores en una matriz de GLbyte. Sin embargo, después de hacerlo, un SIGSEGV (fallo de segmentación) se produjo cuando se llama a glTexImage2D. Cambiar el séptimo parámetro para GL_LUMINANCE (como normalmente se requiere) devuelto la funcionalidad a la normalidad.

Extraño eh?

Por lo tanto, una nota a todos los desarrolladores que utilizan el formato de imagen DICOM: Es necesario convertir la matriz entero a una matriz de caracteres antes de pasarla a glTexImage2D, o simplemente establecer el séptimo argumento para GL_RGBA (probablemente no es recomendable la tarde).

en el FragmentShader, se puede escribir:

uniform sampler2D A;
vec3 result = vec3(texture(A, TexCoord).r);

en el archivo CPP, se puede escribir:

glTexImage2D(
GL_TEXTURE_2D, 0, GL_RED,
dicomImage->GetColumns(), dicomImage->GetRows(),
0, GL_RED, GL_UNSIGNED_BYTE, pixelArrayPtr);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top