OpenCL clCreateFromGLTexture使用不同的纹理目标

时间:2014-04-15 00:54:55

标签: android-ndk opengl-es-2.0 android-camera opencl

我的项目的目的是从Android设备上获取实时摄像头,使用OpenCL对这些图像进行实时过滤并在显示器上渲染输出。

我的目标是实时执行此操作,这就是我使用OpenCL-OpenGL互操作的原因。

我已成功设法使用EGLContext和EGLDisplay创建共享上下文。现在我正在尝试使用clCreateFromGLTexture,以便我可以在OpenCL内核中访问这些图像。然而问题是android需要在绑定纹理时,目标必须是GL_TEXTURE_EXTERNAL_OES,如下所示:(http://developer.android.com/reference/android/graphics/SurfaceTexture.html),但是当使用clCreateFromGLTexture(https://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/clCreateFromGLTexture2D.html)时,此纹理目标不是有效的纹理目标。 / p>

所以我不知道该怎么做。

这就是我在android中创建GL纹理的方法:

    GLES20.glGenTextures(1, texture_id, 0);
    GLES20.glBindTexture(texture_target, texture_target);

这就是我尝试创建cl内存对象的方法:

    glTexImage2D(texture_target, 0, GL_RGBA, 640, 480, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    cl_mem camera_image = clCreateFromGLTexture(m_context, CL_MEM_READ_WRITE, texture_target, 0, texture_id, &err);

我尝试从GL纹理创建cl内存对象时得到的错误是CL_INVALID_VALUE。

我对OpenGL很陌生,所以我可能会看到一些基本的东西。

1 个答案:

答案 0 :(得分:0)

您从相机接收的纹理不是您期望的通常纹理。如果从中读取,您甚至必须在着色器中指定扩展名。

您需要从GL_TEXTURE_EXTERNAL_OES目标执行另一个副本到另一个以常规方式创建的纹理。运气好的话,你可以将它们绑定到fbo' s然后发出blit。如果这不起作用,您可以始终将普通纹理用作渲染目标,只需使用相机图像绘制四边形纹理。