2012-08-02 59 views
2

我想了解android中的OpenGL ES 2.0。我從教程中得到了一段代碼,但我不明白這個紋理是如何工作的。我甚至無法理解渲染髮生在哪裏。這是我得到的代碼。將可繪製資源加載到紋理並呈現它

@Override 
public void surfaceCreated(GL10 gl) { 
    // set up the surface 
    gl.glDisable(GL10.GL_DITHER); 
    gl.glHint(
     GL10.GL_PERSPECTIVE_CORRECTION_HINT, 
     GL10.GL_FASTEST); 
    gl.glClearColor(0.4f, 0.2f, 0.2f, 0.5f); 
    gl.glShadeModel(GL10.GL_SMOOTH); 
    gl.glEnable(GL10.GL_DEPTH_TEST); 
    // fetch the checker-board 
    initImage(gl); 
} 
@Override 
public void drawFrame(GL10 gl) { 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity(); 
    GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f); 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 
    // apply the checker-board to the shape 
    gl.glActiveTexture(GL10.GL_TEXTURE0); 
    gl.glTexEnvx(
     GL10.GL_TEXTURE_ENV, 
     GL10.GL_TEXTURE_ENV_MODE, 
     GL10.GL_MODULATE); 
    gl.glTexParameterx(
     GL10.GL_TEXTURE_2D, 
     GL10.GL_TEXTURE_WRAP_S, 
     GL10.GL_REPEAT); 
    gl.glTexParameterx(
     GL10.GL_TEXTURE_2D, 
     GL10.GL_TEXTURE_WRAP_T, 
     GL10.GL_REPEAT); 
    // animation 
    int t = (int) (SystemClock.uptimeMillis() % (10 * 1000L)); 
    gl.glTranslatef(6.0f - (0.0013f * t), 0, 0); 
    // draw 
    gl.glFrontFace(GL10.GL_CCW); 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuf); 
    gl.glEnable(GL10.GL_TEXTURE_2D); 
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuf); 
    gl.glDrawElements(
     GL10.GL_TRIANGLE_STRIP, 
     5, 
     GL10.GL_UNSIGNED_SHORT, indexBuf); 
} 

private void initImage(GL10 gl) { 
    int[] textures = new int[1]; 
    gl.glGenTextures(1, textures, 0); 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); 
    gl.glTexParameterf(
     GL10.GL_TEXTURE_2D, 
     GL10.GL_TEXTURE_MIN_FILTER, 
     GL10.GL_NEAREST); 
    gl.glTexParameterf(
     GL10.GL_TEXTURE_2D, 
     GL10.GL_TEXTURE_MAG_FILTER, 
     GL10.GL_LINEAR); 
    gl.glTexParameterf(
     GL10.GL_TEXTURE_2D, 
     GL10.GL_TEXTURE_WRAP_S, 
     GL10.GL_CLAMP_TO_EDGE); 
    gl.glTexParameterf(
     GL10.GL_TEXTURE_2D, 
     GL10.GL_TEXTURE_WRAP_T, 
     GL10.GL_CLAMP_TO_EDGE); 
    gl.glTexEnvf(
     GL10.GL_TEXTURE_ENV, 
     GL10.GL_TEXTURE_ENV_MODE, 
     GL10.GL_REPLACE); 
    InputStream in = context.getResources().openRawResource(R.drawable.cb); 
    Bitmap image; 
    try { image = BitmapFactory.decodeStream(in); } 
    finally { 
     try { in.close(); } catch(IOException e) { } 
    } 
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, image, 0); 
    image.recycle(); 
} 

任何人都可以向我解釋圖像從可繪製文件中加載的位置,其中轉換爲紋理以及渲染髮生在哪裏?我似乎無法理解這一點。我熟悉如何在OpenGL中完成它,但似乎OpenGL ES 2.0使用了不同的技術?

+2

請注意,您在此處未執行任何OpenGL ES ** 2 **,因此您的代碼是OpenGL ES ** 1 **,因爲您未使用任何着色器。 – rotoglup 2012-08-05 16:23:35

回答

3

GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, image, 0);是一個將android位圖轉換爲OpenGL紋理的實用函數。

當它被調用時,它將image中的位圖存儲到當前綁定的紋理中,在你的情況下它是textures[0]

glDrawElements是實際觸發渲染調用的命令。如果你想知道其他功能的作用,我建議看看他們的在線幫助頁面。

+0

啊我明白了,謝謝..清理了一下。 :) – kishidp 2012-08-02 03:49:46