Posso usar uma imagem em tons de cinza com a função OpenGL glTexImage2D?
Pergunta
Eu tenho uma textura que tem apenas 1 canal como ele é uma imagem em tons de cinza. Quando eu passar os pixels para glTexImage2D, ele sai vermelho (obviamente, porque o canal 1 é vermelha; RGB).
glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGBA,
dicomImage->GetColumns(), dicomImage->GetRows(),
0, GL_RGBA, GL_UNSIGNED_BYTE, pixelArrayPtr);
mudança GL_RGBA Do I? Se assim for, o que?
Solução
Alterar-lo para GL_LUMINANCE. Consulte http://www.opengl.org/ documentação / especificações / man_pages / impressa / GL / html / gl / teximage2d.html
Outras dicas
Parece que eu deveria usar GL_LUMINANCE
vez de GL_RGBA
para o 3º argumento.
Editar (em resposta aos comentários):
Quando eu definir o dia 7 de argumento para GL_LUMINANCE
(bem como o 3º), a imagem vai completamente distorcida. Com o formato de pixel DICOM, parece que a 7ª argumento deve ser GL_RGBA
por algum motivo.
O comportamento estranho é porque eu estou usando o DICOM padrão. O leitor DICOM especial Eu estou usando saídas valores de pixel inteiro (como valores de pixel pode exceder o máximo normal de 255). Por alguma estranha razão, a combinação de dizer OpenGL que estou usando um formato RGBA, mas passando em valores inteiros prestado uma imagem perfeita.
Porque eu estava truncando o DICOM> 255 valores de pixel de qualquer maneira, parecia lógico para copiar os valores para uma matriz GLbyte. No entanto, depois de fazer isso, um SIGSEGV (falha de segmentação) ocorreu ao chamar glTexImage2D
. Alterando o sétimo parâmetro para GL_LUMINANCE
(como é normalmente exigido) voltou a funcionalidade ao normal.
Estranho né?
Assim, uma nota para todos os desenvolvedores que usam o formato de imagem DICOM: Você precisa converter a matriz inteiro para uma matriz de caracteres antes de passá-lo para glTexImage2D
, ou apenas definir o dia 7 de argumento para GL_RGBA
(o mais recente é provavelmente não recomendado).
no FragmentShader, você pode escrever:
uniform sampler2D A;
vec3 result = vec3(texture(A, TexCoord).r);
no arquivo cpp, você pode escrever:
glTexImage2D(
GL_TEXTURE_2D, 0, GL_RED,
dicomImage->GetColumns(), dicomImage->GetRows(),
0, GL_RED, GL_UNSIGNED_BYTE, pixelArrayPtr);