强制 OpenGL 缓冲区使用 GL 1.0 或 1.1



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

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

最初,我试图通过glReadPixelsGLSurfaceView读取Renderer,但事实证明我无法从中获取屏幕外数据。相反,我选择做一个屏幕外缓冲区来生成图像的渲染,可以将其转换为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代码:链接。呼叫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)

这是渲染器的一种方法。一切都必须在此方法中完成。你可以把一个布尔值,比如说,放到渲染器中,当你想在渲染器中做一些事情时,把它设置为 true,就是这样。如果您在此方法之外进行任何调用,您将获得错误。

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

该方法必须在 onDrawFrame 中调用

最新更新