【问题标题】:How to grab the OpenGL context created by Android's GLSurfaceView?如何获取 Android 的 GLSurfaceView 创建的 OpenGL 上下文?
【发布时间】:2014-08-20 20:15:41
【问题描述】:

我正在尝试开发一个 Android 应用程序来处理(在 OpenCL 中)相机预览的每一帧。预览是通过使用 OpenGL 的 Android 的 GLSurfaceView 和 SurfaceTexture 实现的。我的问题是,从 JNI 方面来看,我不知道如何获取 OpenGL 上下文。

我正在努力关注这篇出色的文章,OpenCL and OpenGL Interoperability Tutorial,作者是 Intel 的 Maxim Shevtsov。 Maxim 的文章假设读者已经创建了 OpenGL 上下文,并且 OpenGL 上下文和 HDC 都可用。对于大多数人来说,这是一个很好的起点。然而,这就是我的挑战所在。

我用来创建 OpenGL 上下文的 Java 代码是这样的:

// SurfaceView
public class CamGLView extends GLSurfaceView
{
    CamGLViewRenderer mRenderer;
    CamGLView(Context context) {
        super(context);
        mRenderer = new CamGLViewRenderer(this);
        setEGLContextClientVersion(3);  //OpenGL context is created, but how to get hold of it from JNI side ?
        setRenderer((Renderer)mRenderer);
        setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
    }
    ......
}

// Renderer
public class CamGLViewRenderer implements GLSurfaceView.Renderer, SurfaceTexture.OnFrameAvailableListener
{
    @Override
    public void onSurfaceCreated(GL10 unused, EGLConfig config) {
        mSTexture = new SurfaceTexture(mTexID[0]);
        if (null == mSTexture) {
            Log.e(mTag, "Creating SurfaceTexture failed !");
            return;
        }
        mSTexture.setOnFrameAvailableListener(this);

        // Setup the camera preview
        try {
            mCamera.setPreviewTexture(mSTexture);
        } catch(IOException ioe) 
        {
            Log.e(mTag, "Camera.setPreviewTexture Error! " + ioe.getMessage());
            ioe.printStackTrace();
            return;
        }
    }
    ......
}

Android 应用已启动并正在运行。显示相机预览。现在在 JNI 端,我想抓取每个预览帧,将其发送到 OpenCL 内核进行处理,然后将其发送回 OpenGL 进行显示。首先,我需要 JNI 端的 OpenGL 上下文。

有什么想法和想法可以解决我的问题吗?

非常感谢

【问题讨论】:

标签: android opengl-es opencl


【解决方案1】:

在我们的代码中,上下文是在 Java 中创建的,然后通过 JNI 将控制权简单地传递给 C。

我们将 eglGetCurrentContext() 用于 Jay 提到的 CL_GL_CONTEXT_KHR 属性,此外,我们使用 eglGetCurrentDisplay() 作为 CL_EGL_DISPLAY_KHR 属性。这些已在我们测试过的所有 Android 设备上运行。

【讨论】:

  • 这就是我的猜测。最好有人确认。 clGetGLContextInfoKHR() 仍然返回错误代码-64(是的,它是-64),但我认为我走在正确的道路上。谢谢!
  • 您是否尝试将它们按原样传递给属性列表中的 clCreateContext?即使 clGetGLContextInfoKHR 失败,它也可以正常工作。请记住,IMG GPU 仅支持通过 EGL 图像共享来共享纹理,您无法通过它访问 VBO。我知道的所有其他 GPU 都支持 GL 共享。
【解决方案2】:

我相信您可以通过与 NativeActivity 源代码演示类似的方式找到所需内容。

NativeActivity 在 android-ndk/samples/NativeActivity 中随 SDK 一起提供,并调用 eglCreateContext(),但也有与 NDK 中可用的 EGL 引用相关联的类似调用,例如 eglGetCurrentContext()。您应该能够通过这些 API 以这种方式检索上下文。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-22
    • 2011-09-24
    • 1970-01-01
    • 2012-07-04
    • 2017-09-03
    • 2014-06-02
    • 1970-01-01
    相关资源
    最近更新 更多