OpenGL Raster Transformation не дает ожидаемых результатов

Похоже, в Интернете не так много примеров того, как правильно использовать методы преобразования растра, предоставляемые 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(...)?

Почему мое текущее использование дает серый прямоугольник и никоим образом не копирует и не рисует пиксели на изображении?

введите описание изображения здесь

1

Решение

После продолжительного чата было выявлено несколько проблем:

  1. GL_RGB пиксели не очень нравятся glReadPixels (...) а также glDrawPixels (...)

    • Используя хранилище пикселей по умолчанию, GL пытается сохранить каждую читаемую строку на 4-байтовой границе; Трехбайтовые RGB-пиксели создают беспорядок из этого и многих других вещей в OpenGL.

    • Вы должны позвонить glPixelStorei (GL_PACK_ALIGNMENT, 1) до glReadPixels (...) с GL_RGB формат, или он может дополнить конец каждой строки в выход с дополнительными байтами, чтобы удовлетворить 4-байтовое выравнивание строки. Если этот флажок не установлен, выравнивание по умолчанию в конечном итоге приведет к переполнению памяти.

    • Точно так же вам нужно использовать glPixelStorei (GL_UNPACK_ALIGNMENT, 1) до glDrawPixels (...) так что он не пытается пропустить байты для поддержания 4-байтового выравнивания при чтении строк из вашего вход данные.

  2. Ваш массив был объявлен неправильно, вы выделяете массив указателей.

    • Указатель на GLubyte значительно больше, чем GLubyte само по себе (в 4-8 раз больше в зависимости от компилятора / процессора).

    • Правильный способ объявить ваш массив пикселей GLubyte data [115 * 35 * 3], для хранения 115 * 35 пикселей, каждый 3 байта.

  3. Положение растра находится в координатах пространства объекта, но положение в glReadPixels (...) находится в координатах пространства окна.

    • Без соответствующей матрицы проекции, области просмотра и т. Д. Масштаб между системами координат (объект и окно) не будет совпадать, и вы не сможете точно сказать, что ваш треугольник равен 115 пикселей высокий и 35 пикселей широкий (это его объектно-пространственные размеры).
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]