Подтвердить что ты не робот

Можно ли использовать изображение в градациях серого с функцией 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? Если да, то что?

4b9b3361

Ответ 2

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

Изменить (в ответ на комментарии):

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

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

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

Странно, а?? // " >

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

Ответ 3

в 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);