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

标签 java android opengl-es

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

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

最初,我尝试通过 glReadPixelsGLSurfaceView 中读取 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/

相关文章:

java - 验证上传的文件是否为 jpg 和 png 并保存到静态文件夹

android - 在 Activity 过渡动画期间保持 Action Bar 稳定

android - OpenGL ES 3.0 中的多重采样 FBO

android - 避免内部 getter/setter

android - 如何将 2D 显示坐标映射到 3D OpenGL 空间

ios - 使用像素数据创建 CVPixelBuffer,但最终图像失真

java - 无法更改操作栏背景

java - 如何使用 useDelimiter 过滤信息

java - 更新现有的 JobDataMap

java - NoClassDefFoundError : Urban Airship for Android Push