Первое, что нужно понять: OpenGL - это всего лишь API для рисования. Вы отправляете команды рисования, и он просто изменит цвет некоторых пикселей в целевом буфере кадров. В OpenGL нет высокоуровневой функциональности, которая абстрагирует геометрию в управляемые объекты. Это то, что делает граф сцены.
A история отмен / повторов требует хранить все операции рисования в отдельной структуре, например, связанный список операций рисования.
Каждая новая операция добавляется в список. Отмена будет осуществлена, возвращаясь назад. Любая новая операция после некоторых шагов отмены отбрасывает хвост и строит новую.
На стороне OpenGL вы можете либо перерисовать весь список после Undo / Redo, либо на каждом шаге сохранять состояние framebuffer; это, однако, потребляло бы много памяти, поэтому хранение только различий и использование некоторой простой схемы сжатия (длина выполнения и предварительное разбиение на фрагменты) экономит память.