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