Ответ 1
Измените его на GL_LUMINANCE. См. http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/teximage2d.html
У меня есть текстура, которая имеет только 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
Похоже, что для 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
(более поздний вероятно, не рекомендуется).
в 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);