Скопируйте блок пикселей произвольного размера в текстуру OpenGL ES ... как-нибудь? - PullRequest
1 голос
/ 21 мая 2009

Я пишу приложение для рисования, а холст для рисования - это текстура OpenGL. Когда вы рисуете на холст, он определяет, какая область текстуры холста была изменена, и копирует эти данные пикселей (используя glReadPixels) перед применением внесенных вами изменений.

Чтобы отменить, я хочу просто вернуться к предыдущему состоянию текстуры, используя те данные пикселей, которые были скопированы. Однако OpenGL ES не предоставляет команду glDrawPixels. Какой лучший способ сделать это?

Я рассмотрел два варианта, но я не уверен, что либо это так здорово:

  1. Создайте временную текстуру, используя скопированные мною пиксели, и нарисуйте ее. (Однако скопированная область не имеет степени двойки!)

  2. Полностью отсоедините большую текстуру холста, вручную измените байты текстуры, а затем верните ее обратно в OpenGL. Я не использую какое-либо сжатие, так что это может быть не так уж плохо. Но это похоже на взлом?

У кого-нибудь есть идеи? Буду очень признателен!

1 Ответ

1 голос
/ 22 мая 2009

На случай, если кто-нибудь натолкнется на это, пытаясь сделать что-то подобное, я придумаю решение, которое, кажется, работает хорошо.

  1. Получите изображение текущей текстуры, связав его с буфером кадров, а затем записав буфер кадров в CGImageRef.
  2. Создайте новый CGContext и нарисуйте существующую текстуру CGImageRef. Затем нарисуйте старые данные текстуры в той части, которую изменил пользователь, фактически «отменив» это изменение в изображении.
  3. Уничтожьте старую текстуру OpenGL и создайте текстуру из CGContext.

Я думаю, что это довольно медленный способ решения проблем, но мне не нужна огромная производительность - моей настоящей заботой было ограничение количества данных, хранящихся для представления "старой" текстуры.

Если вам нужна помощь с этим (кода довольно много), напишите мне.

...