OpenGL ES 2.0 загрузка текстур - PullRequest
       9

OpenGL ES 2.0 загрузка текстур

0 голосов
/ 16 декабря 2011

Я делаю карусель для Android OpenGL ES 2.0.У меня есть функция «для», которая в каждой итерации вызывает функцию «drawSquares», которая рисует квадраты в круге.Это делается путем изменения modelMatrix каждый раз, когда рисуется новый квадрат.(Для рисования квадратов я использую один и тот же вершинный и фрагментный шейдеры)

Мне нужно наложить текстуры на квадраты, но для каждого квадрата нужно иметь различную текстуру.Кажется, я не могу этого сделать.Я попытался изменить значение дескриптора для данных текстуры прямо перед вызовом drawSquare.

mTextureDataHandle = TextureHelper.loadTexture(context, item.getTexture());  

Но каждый квадрат имеет одинаковую текстуру.

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

1 Ответ

2 голосов
/ 16 мая 2012

Старт Здесь . У вас есть несколько вариантов -

  1. glBindTexture - каждый раз, когда вы загружаете новую текстуру в свой дескриптор, вам придется связывать ее снова
  2. Используйте массив дескрипторов - вы можете установить mTextureDataHandle как int [], заполнить его, а затем привязать каждую текстуру к отдельной текстуре GL:

    mTextureDataHandle[0] = ...; //Load textures - repeat for [1..N]
    /* 
    *  Select which GL texture spot to use - GL has 30 pointers to use, your device 
    *  likely won't support that many
    */
    GLES20.glSetActiveTexture(GLES20.GL_TEXTURE0);
    GLES20.glBindTexture(GL_TEXTURE_2D, mTextureDataHandle[0]);
    
    GLES20.glSetActiveTexture(GLES20.GL_TEXTURE1);
    GLES20.gBindTexture(GL_TEXTURE_2D, mTextureDataHandle[1]);
    
    //To draw with the right texture select which GL texture to point to (index):
    GLES20.glUniform1i(mtextureUniformHandle, index);
    drawStuff();
    

    Здесь вы будете ограничены количеством текстур, поддерживаемых вашим устройством - используйте

    IntBuffer max = IntBuffer.allocate(1);
    GLES20.glGetIntegerv(GLES20.GL_MAX_TEXTURE_IMAGE_UNITS, max);
    Log.d("tag","Texture units: " + max.get());
    
  3. Или некоторая комбинация двух опций - т.е. сэкономить время процессора от загрузки, имея массив предварительно загруженных текстур, но вам может понадобиться связать хотя бы некоторые из них на лету, чтобы избежать исчерпания доступных текстуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...