Не так давно я опробовал программу из путеводителя OpenGL, которая, как говорили, была с двойной буферизацией; он отображал вращающийся прямоугольник на экране. К сожалению, у меня больше нет книги, и я не нашел четкого и простого определения того, что такое буфер в целом. Я предполагаю, что это «место» для рисования вещей, где использование много может быть как наслоение?
Если это так, я задаюсь вопросом, могу ли я использовать несколько буферов в моих интересах для программы отсечения полигонов. У меня есть симпатичное маленькое окно, которое позволяет пользователю рисовать многоугольники на экране, а также утилиту для перетаскивания и рисования поля выбора поверх многоугольников. Когда пользователь нарисовал прямоугольник выбора и отпустил мышь, полигоны будут обрезаны по границам прямоугольника.
Это достаточно выполнимо, но я также хочу, чтобы пользователь мог начать все сначала: когда нажата клавиша выхода, поле клипа должно исчезнуть, а исходные многоугольники должны быть восстановлены. Поскольку я делаю вещи попиксельно, кажется, очень трудно понять, как изменить цвета пикселя прямоугольника обратно на черный, как фон, или цвет конкретного многоугольника, в зависимости от того, где они были нарисованы (если я не нахожу способ сохранить цвета, когда нарисован каждый пиксель многоугольника, но это кажется за бортом). Мне было интересно, поможет ли он дать прямоугольнику свой собственный буфер, в надежде, что он будет действовать как своего рода прозрачный слой, который можно легко очистить (?). Так можно использовать буферы или мне нужно? найти другое решение?
OpenGL знает несколько видов буферов:
Кадровые буферы: части памяти, на которые направлены операции рисования, изменяющие значения пикселей в буфере. OpenGL по умолчанию имеет экранные буферы, которые можно разделить на фронт и задний буфер, где операции рисования оказываются невидимыми в обратном буфере и меняются на передний план по окончании. В дополнение к этому OpenGL использует буфер глубины для проверки глубины реализации Z-сортировки, буфер трафарета, используемый для ограничения рендеринга в вырез (= трафарет), подобный выбранным частям кадрового буфера. Раньше были вспомогательные и накопительные буферы. Однако они были заменены так называемыми объектами кадрового буфера, которые являются созданным пользователем объектом, объединяющим несколько текстур или буферов рендеринга в новые кадровые буферы, которые могут быть визуализированы.
Renderbuffers: Созданные пользователем цели рендеринга, которые будут прикреплены к объектам кадрового буфера.
Буферные объекты (вершины и пиксели): пользовательское хранилище данных. Используется для данных геометрии и изображения.
Текстуры. Текстуры являются своего рода буферами, то есть они содержат данные, которые могут быть источниками в операциях рисования.
Обычный подход к OpenGL — перерисовывать всю сцену всякий раз, когда что-то меняется. Если вы хотите сохранить эти операции рисования, вы можете скопировать содержимое кадрового буфера в текстуру, а затем просто нарисовать эту текстуру в один квад и перерисовать ее с помощью выделенного прямоугольника с резиновой полосой.
Других решений пока нет …