如何解决使用OpenCL缓冲区在OpenGL 2.0 ES中绘制纹理
我正在Android smartphonne上使用ARM mali 72。
我想使用OpenCL的输出缓冲区将其像纹理一样渲染到OpenGL中。
单独使用openCL没问题,单独使用openGL也没有问题。
我对如何在同一个应用程序中同时使用这两者没有任何了解。
目标是使用mY输出OpenCL并将其发送到openGL。
逐步完成一些代码会很好。
我可以在smartphonne上使用openCL 2.0和opengl ES 3.0。
**************添加了30/09/2020 ************
似乎我需要更多有关如何解决问题的信息。
所以我的配置是!我已经开发了Java OpenGL ES应用程序。我从Camera.OnPreviousFrame撤回了摄像机框架,然后使用JNI将其发送到OpenCL。
所以我想从Java OpenGL ES获取EGL显示,通过JNI发送它,然后计算我的openCL内核,然后将其发送回Java OpenGL ES。
我知道如何从OpenCL中检索数据,将其转换为位图,并使用SurfaceTexture和GL_TEXTURE_EXTERNAL_OES将其显示到openGL ES中。
我的问题是如何从Java OpenGL ES检索EGL显示。如何将其发送到C ++,我可以设法使用JNI找出来。但是我不知道如何使用EGL和OpenCL来实现C ++部分。
BenMark的答复在处理方面很令人头疼,但我遗漏了一部分。可以使用Java openGL ES来使用我的配置,还是我可以使用nedd在本机中完成所有EGL,openGL,openCL代码?
非常感谢您帮助我理解问题并尝试找到解决方案。 ;))
解决方法
我还没有编写代码示例,但是-
使用EGL API使GLES和OpenCL API之间的互操作性更加容易。
在该页面上,除其他外:
- 您将希望EGL_KHR_image_base扩展名共享EGL图像。
- 在OpenCL中,您将希望cl_khr_egl_image使用EGL图像,然后必须使用clFinish或clWaitForEvents在OpenCL中进行刷新,以确保该图像可供OpenGL ES使用。
- 必须通过使clEnqueueAcquireEGLObjectsKHR和clEnqueueReleaseEGLObjectsKHR命令排队来指示OpenCL应用程序对EGL映像访问的开始和结束。
我希望这可以帮助您前进。
,这是一个长期存在的问题;))
因此解决方案是:
不可能从其他线程共享上下文。因此,JAVA / OpenCL C ++无法共享数据。因此,根据GLSL版本的不同,可能性也不同。
GLES 2.0: 需要将SurfaceTexture.cpp重写为acces(EGL IMAGE)表面形式的C ++,我什至不知道由于上下文nono线程是否可能。因此,请暂时忘记它;))。 但是您仍然可以使用相机onPrevious来获取数据,然后通过JNI将其发送到C ++ OpenCL,这是我这次要做的。然后将OpenCL输出发送回“显示视图”,并使用Canvas和GL_TEXTURE_EXTERNAL_OES对其进行连接。它可以工作,但是很容易。 ;))而且,从GLSL纹理回到C ++,您将一无所获。
GLSL 3.1: 在Java中使用Compute shader而不是OpenCL。 ;)) 看看What is the difference between OpenCL and OpenGL's compute shader?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。