如何将MapView写入OpenGL纹理

时间:2015-11-30 09:29:22

标签: android opengl-es-2.0 google-maps-android-api-2

现在,我尝试将GoogleMaps Android API的MapView编写为OpenGLES2.0纹理,并在Android Project中使用OpenGL显示纹理。

但到目前为止,我无法做到这一点。它仅显示Google徽标和背景。地图未显示。

我尝试的是以下内容。 1)制作OpenGL纹理。 2)制作MapView的SubClass,并使用重写的draw方法编写Texture。 3)使用GLSurfaceView.Renderer继承类来设置显示区域并在每个帧中渲染纹理。

你知道如何将GoogleMap写入OpenGL纹理,然后渲染吗?

以下是我的代码中与此事有关的部分。

- 这是MapView SubClass的重写绘制方法

@Override
 public void draw(Canvas canvas){
        final Canvas surfaceCanvas = surface.lockCanvas( null );
        super.draw(surfaceCanvas);
        surface.unlockCanvasAndPost( surfaceCanvas );
  }

- GLSurfaceView.Renderer继承了Class(使用名为GLES的Shader类)

@Override
public void onSurfaceCreated(GL10 gl10,EGLConfig eglConfig) {
    GLES.makeProgram();        

    GLES20.glEnableVertexAttribArray(GLES.positionHandle);
    GLES20.glEnableVertexAttribArray(GLES.uvHandle);      

    GLES20.glEnable(GLES11Ext.GL_TEXTURE_EXTERNAL_OES);
    GLES20.glEnable(GLES20.GL_BLEND);    
    GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA,
    GLES20.GL_ONE_MINUS_SRC_ALPHA);
    uvBuffer=makeUVBuffer();
 }

@Override
public void onSurfaceChanged(GL10 gl10,int w,int h) {
    surface = null;
    surfaceTexture = null;

      textureId=createTexture();

      GLES20.glViewport(0,0,w,h);
      screenW=w;
      screenH=h;

      vertexBuffer0=makeVertexBuffer(50,50,200,200);
      vertexBuffer1=makeVertexBuffer(50,300,300,300);

      if(textureId > 0){
        surfaceTexture = new SurfaceTexture( textureId );
        surfaceTexture.setDefaultBufferSize( 1134,  1134);
        GL20TextureEx1.surface = new Surface( surfaceTexture ); 
      }
}

@Override
 public void onDrawFrame(GL10 gl10) {
    synchronized ( this ) {
                surfaceTexture.updateTexImage();
     }
     GLES20.glClearColor(0.5f,1.0f,1.0f,0.0f);
     GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);

     GLES20.glActiveTexture(GLES20.GL_TEXTURE0);

     GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textureId);

     GLES20.glUniform1i(GLES.texHandle,0);

     GLES20.glVertexAttribPointer(GLES.uvHandle,2,
        GLES20.GL_FLOAT,false,0,uvBuffer);

     GLES20.glVertexAttribPointer(GLES.positionHandle,3,
        GLES20.GL_FLOAT,false,0,vertexBuffer0);
     GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP,0,4);

     GLES20.glVertexAttribPointer(GLES.positionHandle,3,
        GLES20.GL_FLOAT,false,0,vertexBuffer1);
     GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP,0,4);
 }

1 个答案:

答案 0 :(得分:0)

您无法拍摄地图视图并在任何地方绘制,您必须拍摄地图的快照然后渲染它。不幸的是,它是一种异步方法,所以它可能是您的Opengl ES应用程序的一个问题... 这里有一个关于如何执行请求快照的示例:

SnapshotReadyCallback callback = new SnapshotReadyCallback() {

                @Override
                public void onSnapshotReady(Bitmap snapshot) {
                    try {
                       //Your Snapshot is ready, do whatever you need Here! 
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            };

            map.snapshot(callback);