我的项目的目的是从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)时,这个纹理目标不是有效的纹理目标。
所以我不知道该怎么做。
以下是我如何在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非常陌生,所以我可能忽略了一些基本的东西。
发布于 2014-04-15 09:44:44
你从相机中得到的纹理不是你所期望的那样。如果从着色器中读取,甚至必须在着色器中指定扩展名。
您需要执行从GL_TEXTURE_EXTERNAL_OES目标到另一个纹理的额外复制,该纹理是以通常的方式创建的。幸运的话,你可以把它们都绑定到fbo上,然后再发blit。如果这不起作用,您可以始终使用正常纹理作为渲染目标,只需绘制一个四纹理与相机图像。
https://stackoverflow.com/questions/23072859
复制相似问题