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?

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top