Скопируйте блок пикселей произвольного размера в текстуру OpenGL ES... как-нибудь?
Я пишу приложение для рисования, а холст для рисования - это текстура OpenGL. Когда вы рисуете на холст, он определяет, какая область текстуры холста была изменена, и копирует эти данные пикселей (используя glReadPixels) перед применением внесенных вами изменений.
Чтобы отменить, я хочу просто вернуться к предыдущему состоянию текстуры, используя те данные пикселей, которые были скопированы. Однако OpenGL ES не предоставляет команду glDrawPixels. Какой лучший способ сделать это?
Я рассмотрел два варианта, но я не уверен, что это тоже здорово:
Создайте временную текстуру, используя скопированные мной пиксели, и нарисуйте ее. (Однако скопированная область не имеет степени двойки!)
Полностью отсоедините большую текстуру холста, вручную измените байты текстуры, а затем верните ее обратно в OpenGL. Я не использую какое-либо сжатие, так что это может быть не так уж плохо. Но это похоже на взлом?
У кого-нибудь есть идеи? Я действительно ценю это!
1 ответ
На случай, если кто-то наткнется на это, пытаясь сделать что-то подобное, я придумаю решение, которое, кажется, будет работать хорошо.
- Захватите изображение текущей текстуры, привязав его к кадровому буферу и затем записав кадровый буфер в CGImageRef.
- Создайте новый CGContext и нарисуйте существующую текстуру CGImageRef. Затем нарисуйте старые данные текстуры в той части, которую пользователь изменил, эффективно "отменив" это изменение в изображении.
- Уничтожьте старую текстуру OpenGL и создайте текстуру из CGContext.
Я думаю, что это довольно медленный способ решения проблем, но мне не нужна огромная производительность - моя настоящая проблема заключалась в ограничении объема данных, сохраняемых для представления "старой" текстуры.
Если вам нужна помощь с этим (кода довольно много), напишите мне.