2012-12-18 155 views
1

OpenGL ES 2.0中的函數的GLSurfaceRenderer中可以生成紋理嗎?例如,我使用的代碼如下所示。在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