2013-09-26 3 views
0

Я работаю над этим приложением для фотографий, которое использует OpenGL 2.0 с помощью Renderer, вне экрана GLSurfaceView и некоторых шейдерных скриптов (* .fsh и * .vsh).Используйте OpenGL для рисования шейдера в потоке?

после загрузки шейдерных скриптов из папки «Активы», подготовки поверхности и контекста GL и т. Д., И т. Д., Мы наконец вызываем GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, 4);, и он работает очень хорошо, и он генерирует растровые изображения с эффектами.

Проблема, КУРС, является ограничением памяти и любым достаточно большим растровым изображением (независимо от устройства, не такого большого для старых пряников и очень больших изображений для Nexus 10), и оно будет производить и OutOfMemoryException.

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

Итак, вопрос в том, есть ли способ применить шейдер/рендеринг openGl через Stream вместо битового массива в памяти? Если да, любой указатель на ссылку или базовую процедуру?

+0

Извините за глупый вопрос, я новичок в OpenGl, как вы рисуете шейдеры за кадром? как я понял из документационного рендеринга в GLSurfaceView, должен быть успешным только в том случае, если он виден. – Nativ

ответ

1

Не совсем уверен, что вы подразумеваете под Stream, но вот еще одно решение. Разделить рендеринг на несколько проходов. Фор Например, если у вас есть 512x512 текстуру и соответствующую четверной к текстуре, но могут позволить себе только загрузить 256x256 из-за ограничений памяти выполните следующие действия:

  • разделить текстуру на 4 куски
  • создать единый , установка текстуры объекта
  • для каждой порции
    • загрузить текущий чанка в текс объекты хранилища данных
    • рисовать 1/4 четырехугольника, например, верхний левый и текстуры соответственно

Обратите внимание, что в приведенном выше примере предполагают 512x512 текстуры и размера экрана. В любом случае, я думаю, вы поняли эту идею.

Очевидно, что это обычная торговля памятью/производительностью. Вы обходите ограничения памяти, используя большую пропускную способность для передач и делаете больше рендеринга.

Примечание: Я рабочий стол GL, и я не совсем уверен, как разделить память между GPU и остальными, или если есть даже выделенный VRAM. Я предполагаю, что у вас есть ограниченная сумма для ресурсов GL, которая даже меньше, чем общая системная память.

+0

привет. Спасибо за ввод. Я имел в виду InputStream, или, точнее, FileInputStream. Это интересная идея, которую вы дали, и я обязательно посмотрю на нее. Память такая же, что и для всей виртуальной машины Java. – Budius

+0

@Budius: Если вы можете загружать части текстуры с помощью классов потоков, вы можете так же легко загрузить набор строк из изображения непосредственно с SD-карты или внутренней памяти и загрузить ее в объект текстуры. – thokra

Смежные вопросы