我一直在从事一个项目,在该项目中,用户可以与 a 交互以GLSurfaceView
在屏幕上绘制形状。这一切都很好,花花公子,但现在我正在尝试做两件事:1)创建他们绘图的缩略图,2)保存他们的绘图。需要注意的是,用户可以绘制比屏幕大的图像。
据我的研究表明,最好使用 a Bitmap
(可以是 1)渲染Canvas
为 a 缩略图,2)保存到文件系统,这实现了我的两个目标)。
最初,我试图Renderer
从GLSurfaceView
via中读取glReadPixels
,但事实证明我无法从中获取屏幕外数据。相反,我选择做一个离屏缓冲区来生成图像的渲染,它可以转换为Bitmap
.
我找到了一篇可爱的帖子PixelBuffer
,它为我现在正在使用的一个名为 的类提供了代码。(我做了一些调整,但我遇到的所有问题都有或没有说调整。)
现在,当使用getBitmap()
代码时(如果PixelBuffer
论坛帖子不可读,我将在下面发布),我得到一堆called unimplemented OpenGL ES API
. 起初这让我觉得很奇怪,所以我做了一些调查。事实证明,由于某种原因,PixelBuffer
该类使用的是 OpenGL ES 2.0,而 GLSurfaceView 使用的是 OpenGL ES 1.1。我使用的设备(Galaxy Nexus)不支持 2.0。(此外,我想支持尽可能多的设备。)
所以,这是我的问题:如何强制我的PixelBuffer
班级使用 OpenGL ES 1.1 API?我已经在我的清单中添加了以下内容:
<uses-feature android:glEsVersion="0x00010001" />
此外,我尝试使用int[] version = new int[] { 1, 1 };
, 设置版本无济于事。
PixelBuffer
我正在使用的代码: Link。调用 的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 版进行离屏渲染,将我的 GL 表面转换为Bitmap
使用 1.1 版或更低版本的最佳方法是什么?
编辑:通过一些测试,我发现使用下面的代码会导致这些错误:
// 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 代码中,所以我认为指出它会很好。