Puis-je utiliser une image en niveaux de gris avec la fonction OpenGL glTexImage2D?
Question
J'ai une texture qui a seulement 1 canal que c'est une image en niveaux de gris. Quand je passe les pixels pour glTexImage2D, il sort rouge. (Évidemment parce que le canal 1 est rouge; RGB)
glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGBA,
dicomImage->GetColumns(), dicomImage->GetRows(),
0, GL_RGBA, GL_UNSIGNED_BYTE, pixelArrayPtr);
Dois-je changer GL_RGBA? Si oui, quoi?
La solution
Modifier à GL_LUMINANCE. Voir http://www.opengl.org/ documentation / spécifications / man_pages / copie papier / GL / html / gl / teximage2d.html
Autres conseils
Il semble que je devrais utiliser GL_LUMINANCE
au lieu de GL_RGBA
pour le 3ème argument.
Modifier (en réponse aux commentaires):
Quand je mets le 7 argument GL_LUMINANCE
(ainsi que le 3), l'image devient complètement déformée. Avec le format de pixels DICOM, il semble que le 7ème argument doit être GL_RGBA
pour une raison quelconque.
Le comportement étrange est parce que j'utilise le la norme DICOM. Le lecteur de DICOM particulier J'utilise les sorties des valeurs de pixels entiers (comme des valeurs de pixels peut dépasser le maximum normal de 255). Pour une raison étrange, la combinaison de dire OpenGL que j'utilise un format RGBA, mais en passant par un nombre entier rendu une image parfaite.
Parce que je tronquer les DICOM> 255 valeurs de pixels de toute façon, il semblait logique de copier les valeurs dans un tableau de GLbyte. Cependant, après l'avoir fait, un SIGSEGV (défaut de segmentation) a eu lieu lors de l'appel glTexImage2D
. Modification du paramètre à 7 GL_LUMINANCE
(comme il est normalement nécessaire) la fonctionnalité de retour à la normale.
Bizarre hein?
Ainsi, une note à tous les développeurs utilisant le format d'image DICOM: Vous devez convertir le tableau entier à un tableau de caractères avant de le transmettre à glTexImage2D
, ou tout simplement mettre le 7 argument GL_RGBA
(le plus tard est probablement pas recommandé).
dans le FragmentShader, vous pouvez écrire:
uniform sampler2D A;
vec3 result = vec3(texture(A, TexCoord).r);
dans le fichier cpp, vous pouvez écrire:
glTexImage2D(
GL_TEXTURE_2D, 0, GL_RED,
dicomImage->GetColumns(), dicomImage->GetRows(),
0, GL_RED, GL_UNSIGNED_BYTE, pixelArrayPtr);