Похоже, в Интернете не так много примеров того, как правильно использовать методы преобразования растра, предоставляемые OpenGL.
Я нарисовал простой треугольник и пытаюсь просто скопировать треугольник и перерисовать его где-нибудь еще. Я получаю очень необычные результаты, которые я не понимаю:
Учитывая треугольник (розовый): verts [3] = {{10.0, 25.0}, {125.0, 25.0}, {60.0, 60}};
Я отобразил треугольник:
glClear (GL_COLOR_BUFFER_BIT); // Clear display window.
glColor3f (1.0, 0.5, 0.5); // Set initial fill color (pink).
triangle (verts); // Display colored triangle.
Затем я сделал следующее, чтобы перерисовать треугольник с помощью растровых преобразований:
GLubyte *data [115][35];
glReadPixels(10, 25, 115, 35, GL_RGB, GL_UNSIGNED_BYTE, data);
glRasterPos2i(50,100);
glDrawPixels(35, 115, GL_RGB, GL_UNSIGNED_BYTE, data);
Я думал, что это было копирование всех пикселей, начиная с (10, 25), двигаясь вправо и вверх на 300 пикселей. Это более чем охватывает треугольник.
Я думал, что тогда, рисуя пиксели, он будет просто рисовать их одинаково, как они есть, но вместо этого он рисует серую рамку, которую я даже отдаленно не понимаю.
Как правильно использовать glReadPixels(...);
а также glDrawPixels(...)
?
Почему мое текущее использование дает серый прямоугольник и никоим образом не копирует и не рисует пиксели на изображении?
GL_RGB
пиксели не очень нравятся glReadPixels (...)
а также glDrawPixels (...)
Используя хранилище пикселей по умолчанию, GL пытается сохранить каждую читаемую строку на 4-байтовой границе; Трехбайтовые RGB-пиксели создают беспорядок из этого и многих других вещей в OpenGL.
Вы должны позвонить glPixelStorei (GL_PACK_ALIGNMENT, 1)
до glReadPixels (...)
с GL_RGB
формат, или он может дополнить конец каждой строки в выход с дополнительными байтами, чтобы удовлетворить 4-байтовое выравнивание строки. Если этот флажок не установлен, выравнивание по умолчанию в конечном итоге приведет к переполнению памяти.
Точно так же вам нужно использовать glPixelStorei (GL_UNPACK_ALIGNMENT, 1)
до glDrawPixels (...)
так что он не пытается пропустить байты для поддержания 4-байтового выравнивания при чтении строк из вашего вход данные.
Ваш массив был объявлен неправильно, вы выделяете массив указателей.
Указатель на GLubyte
значительно больше, чем GLubyte
само по себе (в 4-8 раз больше в зависимости от компилятора / процессора).
Правильный способ объявить ваш массив пикселей GLubyte data [115 * 35 * 3]
, для хранения 115 * 35 пикселей, каждый 3 байта.
Положение растра находится в координатах пространства объекта, но положение в glReadPixels (...)
находится в координатах пространства окна.
Других решений пока нет …