我一直致力于一个项目,在该项目中,用户可以与 GLSurfaceView
交互以在屏幕上绘制形状。这一切都很好而且花花公子,但现在我正在尝试做两件事:1) 创建他们绘图的缩略图,以及 2) 保存他们的绘图。请务必注意,用户可以绘制比屏幕大的图像。
据我的研究表明,最好使用 Bitmap
(可以是 1)渲染到 Canvas
的缩略图,以及 2)保存到文件系统,这实现了我的两个目标)。
最初,我尝试通过 glReadPixels
从 GLSurfaceView
中读取 Renderer
,但事实证明我无法关闭 -从这个屏幕数据。相反,我选择做一个屏幕外缓冲区来生成图像渲染,可以将其转换为 Bitmap
。
我找到了一个 lovely post它为我现在正在使用的名为 PixelBuffer
的类提供了代码。 (我做了一些调整,但无论是否进行调整,我都会遇到所有问题。)
现在,当使用代码的 getBitmap()
时(如果 PixelBuffer
论坛帖子不可读,我将在下面发布),我得到了一堆调用了未实现的 OpenGL ES API
。起初这让我觉得很奇怪,所以我做了一些调查。事实证明,出于某种原因,PixelBuffer
类使用的是 OpenGL ES 2.0,而 GLSurfaceView 使用的是 OpenGL ES 1.1。我使用的设备 (Galaxy Nexus) 不支持 2.0。 (此外,我希望支持尽可能多的设备。)
那么,这是我的问题:如何强制我的 PixelBuffer
类使用 OpenGL ES 1.1 API?我已经在我的 list 中添加了以下内容:
<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 版进行离屏渲染,使用 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 代码中,所以我认为指出它会很好。
最佳答案
由于某种原因我没有找到发表评论的链接,很抱歉将此作为答案发布。关于GL线程,一般情况下你只在GL线程中
public void onDrawFrame(GL10 gl)
这是Renderer的一个方法。一切都必须在这个方法中完成。你可以只把一个 boolean 值,比方说,放入渲染器,当你想在渲染器中做某事时将它设置为真,就是这样。如果您在此方法之外进行任何调用,您将收到错误消息。
另外,看看这个例子: Android OpenGL Screenshot 我用过它,它对我有用,但我不需要保存屏幕外区域,所以我不知道它是否会起作用,也许不会:)
该方法必须在onDrawFrame内部调用
关于java - 强制 OpenGL 缓冲区使用 GL 1.0 或 1.1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10974079/