强制OpenGL Buffer使用GL 1.0或1.1?

我一直致力于一个项目,用户可以在其中与GLSurfaceView交互以在屏幕上绘制形状。 这一切都很好,花花公子,但现在我尝试做两件事:1)创建他们的绘图的缩略图,2)保存他们的绘图。 重要的是要注意用户可以绘制比屏幕大的图像。

就我的研究表明,最好使用Bitmap (可以是1)渲染到Canvas的缩略图,2)保存到文件系统,这实现了我的两个目标)。

最初,我试图通过glReadPixelsGLSurfaceView读取Renderer ,但事实certificate我无法从中获取屏幕外数据。 相反,我选择做一个离屏缓冲区来生成图像的渲染,可以将其转换为Bitmap

我发现了一个可爱的post ,它提供了一个名为PixelBuffer的类的代码,我现在正在使用它。 (我做了一些调整,但所有问题都发生在有或没有调整的情况下。)

现在,当使用代码的getBitmap()时(我将在PixelBuffer论坛线程不可读的情况下发布),我得到了一堆被called unimplemented OpenGL ES API 。 起初这让我很奇怪,所以我做了一些调查。 事实certificate,由于某种原因, PixelBuffer类使用的是OpenGL ES 2.0,而GLSurfaceView使用的是OpenGL ES 1.1。 我正在使用的设备(Galaxy Nexus)不支持2.0。 (而且,我想支持最大范围的设备。)

所以,这是我的问题 :如何强制我的PixelBuffer类使用OpenGL ES 1.1 API? 我已经在我的Manifest中添加了以下内容:

  

另外,我试图使用int[] version = new int[] { 1, 1 };设置版本int[] version = new int[] { 1, 1 }; ,无济于事。

我正在使用的PixelBuffer代码: 链接 。 调用Renderer有问题的行在第91行。版本代码在第39行开始。

这是我用来创建PixelBuffer的代码,从GLSurfaceView对象调用:

  setEGLConfigChooser(8, 8, 8, 8, 0, 0); mRenderer = new MyRenderer(this); setRenderer(mRenderer); mPixelBuffer = new CPPixelBuffer(1440, 1280); // TODO Temporary hardcode for Galaxy Nexus wallpaper size mPixelBuffer.setRenderer(mRenderer); 

如果无法将1.1版用于屏幕外渲染,那么使用1.1或更低版本将GL表面转换为Bitmap的最佳方法是什么?

编辑 :通过一些测试,我发现使用下面的代码会导致这些错误:

 // int[] version = new int[2]; int[] version = new int[] { // When using this line, as well as the other marked lines, instead of the line above, the errors are produced. 1, 1 // Marked }; // Marked int[] attribList = new int[] { EGL_WIDTH, mWidth, EGL_HEIGHT, mHeight, EGL_VERSION, 1, // Marked EGL_NONE }; 06-11 15:41:52.316: E/libEGL(5618): eglMakeCurrent:674 error 3009 (EGL_BAD_MATCH) 06-11 15:41:52.316: E/libEGL(5618): call to OpenGL ES API with no current context (logged once per thread) 

但是,这些设置都没有缓解手头的问题。 它们只出现在我的PasteBin’d代码中,所以我认为指出它会很好。

我没有找到发布评论的链接,所以很抱歉发布这个作为答案。 关于GL线程,通常只在GL线程中

 public void onDrawFrame(GL10 gl) 

这是Renderer的一种方法。 一切都必须在这个方法内完成。 你可以把一个布尔值放到渲染器中,当你想在渲染器中完成某些事情时将它设置为true,就是这样。 如果你在这种方法之外做任何电话,你会得到erorrs。

此外,看看这个例子: Android OpenGL截图我已经使用它并且它对我有用,但我不需要保存屏幕外区域,所以我不知道它是否会起作用,也许不是:)

必须在onDrawFrame中调用该方法