OpenGL и отображение изображения в сером масштабе

#c #opengl

#c #opengl

Вопрос:

Я пытаюсь отобразить изображение в сером цвете с помощью OpenGL. Я знаю почти 0 в OpenGL и в основном использую пример, который я нашел в Интернете. Ниже приведен измененный код, который я пытаюсь заставить работать. По сути, я устанавливаю значение серого (от 0 до 255) для изображения размером 100×100, поэтому ожидаю, что изображение будет полностью белым / черным / серым.

Однако, насколько я понимаю, OpenGL ожидает, что входные данные будут RGB, поэтому они должны составлять 24 бита (при условии, что 8 бит на канал). Я работаю только с 8-разрядными изображениями. Я попробовал разные параметры для ввода (GL_ALPHA / GL_RED) из документов http://docs.gl/gl4/glTexImage2D

Могу ли я в любом случае заставить 8-битное изображение, подобное этому, работать?

 int image_width = 100;
int image_height = 100;
unsigned char image_data[image_width * image_height];
// Force the grey value for all pixels
for (int i = 0; i < image_height * image_width; i  ) {
  image_data[i] = 255;
}
// Create a OpenGL texture identifier
GLuint image_texture;
glGenTextures(1, amp;image_texture);
glBindTexture(GL_TEXTURE_2D, image_texture);

// Setup filtering parameters for display
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

// Upload pixels into texture
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, image_width, image_height, 0, GL_ALPHA, GL_UNSIGNED_BYTE, image_data);
  

Комментарии:

1. «Однако, насколько я понимаю, OpenGL ожидает, что входные данные будут RGB, поэтому они должны составлять 24 бита (при условии, что 8 бит на канал)». Это совсем не так. Однако ситуация намного сложнее — форматы данных, которые вы используете в памяти клиента, внутренний формат текстуры и шейдеры — все это играет здесь определенную роль. OpenGL — это API рендеринга, а не библиотека рисования изображений, поэтому, если вы хотите использовать его для этой цели, сначала вам придется изучить множество основ.

Ответ №1:

Если вы используете контекст OpenGL профиля совместимости, вы можете использовать GL_LUMINANCE , где каждый элемент представляет собой единственное значение яркости. Смотрите glTexImage2D .

 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, image_width, image_height, 0,
             GL_LUMINANCE, GL_UNSIGNED_BYTE, image_data);