Могу ли я использовать изображение в оттенках серого с функцией OpenGL glTexImage2D?
Вопрос
У меня есть текстура, которая имеет только 1 канал, так как это изображение в оттенках серого.Когда я передаю пиксели в glTexImage2D, они становятся красными (очевидно, потому, что канал 1 красный;RGB).
glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGBA,
dicomImage->GetColumns(), dicomImage->GetRows(),
0, GL_RGBA, GL_UNSIGNED_BYTE, pixelArrayPtr);
Должен ли я изменить GL_RGBA?Если да, то что делать?
Решение
Измените его на GL_LUMINANCE.Видишь http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/teximage2d.html
Другие советы
Похоже, что я должен использовать GL_LUMINANCE
вместо того , чтобы GL_RGBA
для 3-го аргумента.
Редактировать (в ответ на комментарии):
Когда я установил 7-й аргумент в GL_LUMINANCE
(как и 3-й), картинка получается полностью искаженной.В пиксельном формате DICOM кажется, что 7-й аргумент должен быть GL_RGBA
по какой-то причине.
Странное поведение связано с тем, что я использую DICOM ( ДИКОМ ) стандартный.Конкретный считыватель DICOM, который я использую, выводит целочисленные значения пикселей (поскольку значения пикселей могут превышать обычный максимум в 255).По какой-то странной причине сочетание сообщения OpenGL о том, что я использую формат RGBA, но передачи целочисленных значений создало идеальное изображение.
Поскольку я все равно усекал значения DICOM > 255 пикселей, казалось логичным скопировать значения в массив GLbyte.Однако после этого при вызове произошла ошибка SIGSEGV (сегментации) glTexImage2D
.Изменение 7-го параметра на GL_LUMINANCE
(как обычно требуется) вернул функциональность в нормальное состояние.
Странно, да?
Итак, примечание для всех разработчиков, использующих формат изображений DICOM:Вам нужно преобразовать целочисленный массив в массив символов, прежде чем передавать его в glTexImage2D
, или просто установите 7 - й аргумент в GL_RGBA
(более позднее, вероятно, не рекомендуется).
в разделе FragmentShader вы можете написать:
uniform sampler2D A;
vec3 result = vec3(texture(A, TexCoord).r);
в cpp-файле вы можете записать:
glTexImage2D(
GL_TEXTURE_2D, 0, GL_RED,
dicomImage->GetColumns(), dicomImage->GetRows(),
0, GL_RED, GL_UNSIGNED_BYTE, pixelArrayPtr);