Могу ли я использовать изображение в градациях серого с функцией OpenGL glTexImage2D? - PullRequest
14 голосов
/ 25 марта 2009

У меня есть текстура, которая имеет только 1 канал, поскольку это изображение в градациях серого. Когда я передаю пиксели в glTexImage2D, он выходит красным (очевидно, потому что канал 1 красный; RGB).

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

Могу ли я изменить GL_RGBA? Если да, то что?

Ответы [ 3 ]

16 голосов
/ 25 марта 2009
0 голосов
/ 08 января 2018

во 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);
0 голосов
/ 25 марта 2009

Похоже, что я должен использовать GL_LUMINANCE вместо GL_RGBA для третьего аргумента.

Редактировать (в ответ на комментарии):

Когда я устанавливаю 7-й аргумент в GL_LUMINANCE (как и 3-й), картинка полностью искажается. С пиксельным форматом DICOM кажется, что седьмой аргумент должен быть по какой-то причине GL_RGBA.

Странное поведение, потому что я использую стандарт DICOM . Конкретный читатель DICOM, который я использую, выдает целочисленные значения пикселей (так как значения пикселей могут превышать нормальный максимум 255). По какой-то странной причине комбинация сообщения OpenGL о том, что я использую формат RGBA, но при передаче целочисленных значений, создала идеальное изображение.

Поскольку я все равно усекал значения DICOM> 255 пикселей, было логично скопировать значения в массив GLbyte. Однако после этого при вызове glTexImage2D возникла ошибка SIGSEGV (ошибка сегментации). Изменение седьмого параметра на GL_LUMINANCE (как обычно требуется) вернуло функциональность в нормальное состояние.

Странно, а?

Итак, примечание для всех разработчиков, использующих формат изображения DICOM: вам нужно преобразовать целочисленный массив в массив символов, прежде чем передавать его в glTexImage2D, или просто установить 7-й аргумент в GL_RGBA (последний, вероятно, не рекомендуется).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...