2012-12-18 2 views
1

Возможно ли создать текстуру в функции из GLSurfaceRenderer в OpenGL ES 2.0? Например, код, который я использовал, показан ниже.Создание текстуры в функции отображения в OpenGL ES 2.0

GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, MyTexture); 

int[] mNewTexture = new int[weight * height * 4]; 
for(int ii = 0; ii < weight * height; ii = ii + 4){ 
    mNewTexture[ii] = 127; 
    mNewTexture[ii+1] = 127; 
    mNewTexture[ii+2] = 127; 
    mNewTexture[ii+3] = 127; 
} 

IntBuffer texBuffer = IntBuffer.wrap(mNewTexture); 
GLES20.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA, weight, height, 0, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, texBuffer); 
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); 
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); 

pmF.drawSelf(MyTexture); 

А в коде класс pmF используется для отображения экрана с помощью текстуры. Я заметил, что этот фрагмент кода выполнен. Но результат не отображается на экране.

ответ

1

Да, можно перезагрузить текстуры в onDrawFrame(), я перезагружаю текстуры в этом методе в своем коде OpenGL. Вот отрывок из моего onDrawFrame() кода:

public void onDrawFrame(GL10 glUnused) { 
    if (bReloadWood) { 
     unloadTexture(mTableTextureID); 
     mTableTextureID = loadETC1Texture("textures/" + mWoodTexture); 
     bReloadWood = false; 
    } 
    //... 
} 

Методы unloadTexture() и loadETC1Texture() сделать обычный OpenGL материал разгружать и загружать текстуры на GPU:

protected void unloadTexture(int id) { 
    int[] ids = { id }; 
    GLES20.glDeleteTextures(1, ids, 0); 
} 

protected int loadETC1Texture(String filename) { 
    int[] textures = new int[1]; 
    GLES20.glGenTextures(1, textures, 0); 

    int textureID = textures[0]; 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureID); 


    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); 
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); 

    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_REPEAT); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT); 

    InputStream is = null; 
      // excluded code for loading InputStream for brevity 

    try { 
     ETC1Util.loadTexture(GLES10.GL_TEXTURE_2D, 0, 0, GLES10.GL_RGB, GLES10.GL_UNSIGNED_SHORT_5_6_5, is); 
    } catch (IOException e) { 
     Log.w(TAG, "Could not load texture: " + e); 
    } finally { 
     try { 
      is.close(); 
     } catch (IOException e) { 
      // ignore exception thrown from close. 
     } 
    } 

    return textureID; 
} 
+0

Спасибо. Но мне интересно, можно ли использовать этот метод для перезаписи текстуры? Например, если переменная bReloadWood в вашем коде будет установлена ​​true во второй раз, будет ли исходная память удалена? – Timothy

+0

Да, 'bReloadWood' может быть изменен много раз, и память будет удалена. У меня не было никаких проблем с моим подходом. Сначала удалите текстуру, затем загрузите вместо нее другую. – keaukraine

+0

Большое спасибо. Я попытаюсь использовать этот метод. – Timothy

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