2013-09-06 2 views
0

Теперь я могу сохранить текстуру с помощью glReadPixels(), чтобы читать данные в framebuffer (FBO). Однако у меня возникли две проблемы.Как сохранить большую текстуру (эффективно) OpenGL ES 2.0 в Android

(1) Чтобы сохранить сохраненное качество изображения, размер будет больше, чем GL_MAX_TEXTURE_SIZE (большинство устройств - 4096). Если я создал большую текстуру (например: 4160x3120), я получил ошибку GL_FRAMEBUFFER_UNSUPPORTED при вызове glCheckFramebufferStatus() ....

(2) Если я создал небольшую текстуру (например: 3648x2736), все работает, кроме glReadPixels() будет очень медленным ....

Итак, вернемся к моему вопросу, можно ли преодолеть ограничение максимального размера текстуры и эффективно сохранить его? Спасибо.

+1

Несжатая текстура RGBA 4160x3120px будет равна 50 МБ, насколько быстро вы ожидаете, что на устройстве? –

+0

Вы пытались сделать текстуру. Вам все равно нужно будет скопировать изображение, но вы можете поменять буфер и запустить фоновый поток или, скорее, задачу Async, для обработки в фоновом режиме. – HPP

ответ

0

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

EDIT: На самом деле существует довольно много устройств, где максимальный размер текстуры составляет 2048, хотя 4096 характерен для большинства последних устройств.

2) Вы должны понимать, что это уже очень большая текстура, а не маленькая, поэтому glReadPixels() будет медленным. Я не уверен, что на Android есть способ.

+0

Я гугл весь день. На первый вопрос, похоже, не так, как вы говорите. Во втором вопросе я обнаружил, что glReadPixels() с GL_BGRA и Pixel Buffer Object (PBO), похоже, может повысить производительность. Arttu Peltonan, вы пробовали это решение раньше? – Justin

+0

К сожалению, PBO недоступны в OpenGL ES 2.0, так что это не вариант для вас. Тем не менее, они будут доступны в будущем с OpenGL ES 3.0. –

+0

Спасибо за ваш ответ. Но это действительно расстраивает ... Трудно поверить, что нет возможности быстро сохранить большую текстуру :( – Justin