现在,我尝试将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);
}
答案 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);