2011-12-16 5 views
0

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

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

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

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

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

ответ

2

Начало Here. У вас есть несколько вариантов -

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

    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. Или некоторая комбинация двух параметров, то есть сохранение времени процессора от загрузки с использованием массива предварительно загруженных текстур, но вам может потребоваться привязать хотя бы некоторые из них на лету, чтобы избежать исчерпания доступных текстур.

+0

Благодарим вас за ваш ответ. Я попытаюсь выполнить приведенные выше предложения и надеюсь, что они будут работать. – Sandra

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