2014-09-05 6 views
0

В настоящее время я играю с NDK на Android и OpenGL ES 2.0. Мне интересно, можно ли и как можно загрузить текстуру OpenGl, чтобы я мог избежать полной несжатой текстуры в куче приложения перед тем, как предоставить ее OpenGl. Итак, то, что я хотел бы сделать (упрощенное), читать 512 КБ из памяти в ОЗУ, а затем передать эти 512 кб в OpenGl, а затем загрузить следующий 512 КБ в ОЗУ и т. Д. Поэтому объем памяти для текстурной загрузки всегда должен быть вокруг 512Кб. Тем не менее, во всех примерах OpenGL я вижу, что люди, как правило, загружают ВСЕ необработанные данные изображения в ОЗУ (64 МБ для текстуры 4096х4096х32 бит!), А затем копируют все данные в OpenGl сразу. Наличие пика памяти размером 64 МБ просто для загрузки текстуры !!: -Я еще больше удивляюсь, как мне кажется, что приложение, написанное в java, запущенном внутри виртуальной машины Dalvik, обычно имеет только 16 Мб доступной памяти кучи - так как им удается даже загружать текстуру в OpenGL? Я что-то элементарно не хватает здесь?OpenGl ES 2.0 Загрузить текстуру junkwise

Большое спасибо и наилучшие пожелания Samuel

+0

С 2009 года у приложений не было допустимого ограничения на кучу 16 МБ. Тем не менее, 64 МБ - довольно большой объем данных для одной текстуры на мобильном устройстве, и было бы лучше использовать сжатый формат текстуры. – fadden

ответ

0

Да, текстура может быть загружен в джонки.

ш Чтобы сделать это, нужно сначала вызвать glTexImage2D() с полным размером и нулевой указатель для последнего аргумента, в котором вы иначе передали бы указатель на данные. Это указывает размер и формат текстуры, но не заполняет их данными.

После этого glTexSubImage2D() может использоваться для заполнения текстуры блоками данных.

Например, чтобы заполнить 4096x4096 RGBA текстуру с блоками 1024х1024 Размер:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4096, 4096, 0, 
      GL_RGBA, GL_UNSIGNED_BYTE, 0); 
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1024, 1024, 
       GL_RGBA, GL_UNSIGNED_BYTE, data00); 
glTexSubImage2D(GL_TEXTURE_2D, 0, 1024, 0, 1024, 1024, 
       GL_RGBA, GL_UNSIGNED_BYTE, data01); 
glTexSubImage2D(GL_TEXTURE_2D, 0, 2048, 0, 1024, 1024, 
       GL_RGBA, GL_UNSIGNED_BYTE, data02); 
glTexSubImage2D(GL_TEXTURE_2D, 0, 3072, 0, 1024, 1024, 
       GL_RGBA, GL_UNSIGNED_BYTE, data03); 
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 1024, 1024, 1024, 
       GL_RGBA, GL_UNSIGNED_BYTE, data10); 
glTexSubImage2D(GL_TEXTURE_2D, 0, 1024, 1024, 1024, 1024, 
       GL_RGBA, GL_UNSIGNED_BYTE, data11); 
glTexSubImage2D(GL_TEXTURE_2D, 0, 2048, 1024, 1024, 1024, 
       GL_RGBA, GL_UNSIGNED_BYTE, data12); 
... 

Если вы действительно нужны текстуры это большие, вы можете рассмотреть возможность использования сжатых текстур. К сожалению, поддержка определенных сжатых форматов текстур зависит от устройства в ES 2.0. Но, учитывая, насколько это может сократить использование памяти и, возможно, повысить производительность/мощность, все равно стоит посмотреть. Отъезд glCompressedTexImage2D() для отправной точки.

Конечно, вы также хотите убедиться, что ваши активы не имеют более высокого разрешения, чем необходимо.

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