Могу ли я использовать изображение в оттенках серого с функцией OpenGL glTexImage2D?

StackOverflow https://stackoverflow.com/questions/680125

  •  22-08-2019
  •  | 
  •  

Вопрос

У меня есть текстура, которая имеет только 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 вместо того , чтобы 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top