如何在安卓系统中使用OPEN GL在另一个纹理上设置纹理



我已经搜索了两天了。我正在使用Open GL开发一款android游戏,在这种情况下,我必须同时显示两个图像,一个应该是背景图像,第二个应该根据条件显示。我已经使用Open GL Texture属性显示了背景imgae。但当我试图通过使用纹理来显示第二个图像时,第一个图像没有显示。由于我处理的是多个纹理,所以我使用了GLTexture类来操纵纹理(http://tkcodesharing.blogspot.in/2008/05/working-with-textures-in-androids.html)。即使这样,我也不能同时显示两个图像。

以下是一些代码:

public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    glTextures= new GLTextures(gl,this.context);//class to manipulate textures
   //adding image resources
    this.glTextures.add(R.drawable.back);
    this.glTextures.add(R.drawable.hand);
   //loading texture
   this.glTextures.loadTextures();
    gl.glEnable(GL10.GL_TEXTURE_2D);
   ...
}

In-onDrawFrame

   gl.glClear(GL10.GL_COLOR_BUFFER_BIT|GL10.GL_DEPTH_BUFFER_BIT);
   gl.glLoadIdentity();
   gl.glTranslatef(0.0f, 0.0f, -3.5f);
   glTextures.setTexture(R.drawable.back);//it will bind this particular texture for drawing
  draw(gl);
  if(condition == 1){
            gl.glLoadIdentity();
            gl.glTranslatef(0.0f, 1.0f, -7.0f);
            glTextures.setTexture(R.drawable.hand);
            drawSecond(gl);
        }
////////////////////////////////////////////////////////

在绘图代码中

   public void draw(GL10 gl){
              gl.glActiveTexture(GL10.GL_TEXTURE0);
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        gl.glFrontFace(GL10.GL_CW);
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
        gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length/3);

        gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
  }

  public void drawSecond(GL10 gl){
        gl.glActiveTexture(GL10.GL_TEXTURE1);
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        //GLES20.glUniform1i(isShaked, 1);
        gl.glFrontFace(GL10.GL_CW);
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
        gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length/3);

        gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
   }

删除"gl.glActiveTexture(GL10.GL_TEXTURE0);"gl.glActiveTexture(GL10.GL_TEXTURE1);
渲染代码中的行

只有在需要多重纹理的情况下才能使用多个纹理单元,
其在一个绘制调用中使用多个纹理

仅将第一纹理绑定到活动纹理单元(默认为GL_TEXTURE0)并绘制第一三角形条而不是绑定第二纹理(不改变活动纹理单元GL_TEXTURE0)并绘制第二三角形条。

最新更新