繁体   English   中英

在 OpenGL 2.0 ES 中使用 OpenCL 缓冲区绘制纹理

[英]Using OpenCL buffer To draw texture in OpenGL 2.0 ES

我在我的 Android 智能手机上使用 ARM mali 72。

我想使用来自 OpenCL 的 output 缓冲区将其渲染为 OpenGL,就像纹理一样。

我单独使用openCL没问题。单独使用nether openGL。

我对如何在同一个应用程序中同时使用两者一无所知。

目标是使用我的 output OpenCL 并将其发送到 openGL。

逐步编写一些代码会非常好。

我可以在我的智能手机上使用 openCL 2.0 和 opengl ES 3.0。

************** 添加于 2020 年 9 月 30 日 ************

看起来我需要更多关于如何解决我的问题的信息。

所以我的配置是。 我已经开发了 Java OpenGL ES 应用程序。 我从 Camera.OnPreviousFrame 中检索相机帧,然后使用 JNI 将其发送到 OpenCL。

所以我想从 Java OpenGL ES 获取 EGL 显示通过 JNI 发送它然后计算我的 openCL kernel 将它发送回 java OpenGL ES。

我知道如何从 OpenCL 中检索数据,将其转换为 bitmap 并使用 SurfaceTexture 和 GL_TEXTURE_EXTERNAL_OES 将其显示为 openGL ES。

我的问题是如何从 java OpenGL ES 中检索 EGL 显示。 如何将它发送到 C++,我可以设法使用 JNI 找到它。 但我不知道如何使用 EGL 和 OpenCL 实现 C++ 部分。

BenMark 的回答对处理过程很感兴趣,但我遗漏了一些部分。 可以使用我的配置,使用 java openGL ES 还是我需要做所有的 EGL,openGL,原生的 openCL 代码?

非常感谢您帮助我理解问题并尝试找到解决方案。 ;))

我没有编写代码示例但是 -

使用EGL API 可以更轻松地实现 GLES 和 OpenCL API 之间的互操作性。

此页面提供了一些提示: https://developer.arm.com/documentation/101574/0400/Using-OpenCL-extensions/Inter-operation-with-EGL/EGL-images

从该页面,除其他事项外:

  • 您需要 EGL_KHR_image_base 扩展来共享 EGL 图像。
  • 在 OpenCL 中,您需要 cl_khr_egl_image 使用 EGL 图像,然后您必须使用 clFinish 或 clWaitForEvents 在 OpenCL 中进行刷新,以确保图像随后可供 OpenGL ES 使用。
  • OpenCL 应用程序访问 EGL 图像的开始和结束必须通过排队 clEnqueueAcquireEGLObjectsKHR 和 clEnqueueReleaseEGLObjectsKHR 命令来发出信号。

我希望这能帮助你前进。

这是一个长期存在的问题;))

所以解决方案是:

无法从其他线程共享上下文。 所以JAVA/OpenCL C++无法共享数据。 因此,根据 GLSL 版本,它们有不同的可能性。

GLES 2.0:需要重写 SurfaceTexture.cpp 以访问 (EGL IMAGE) 表面形式 C++,我什至不知道是否可能由于上下文 nono 线程。 所以暂时忘记它;))。 但是您仍然可以使用相机 onPrevious 获取数据,然后通过 JNI 将其发送到 C++ OpenCL,这就是我这次所做的。 然后将 OpenCL output 发送回显示视图,并使用 Canvas 和 GL_TEXTURE_EXTERNAL_OES 对其进行传输。 它有效,但很麻烦。 ;)) 而且你无法从 GLSL 纹理返回到 C++。

GLSL 3.1:在 JAVA 中使用计算着色器而不是 OpenCL。;))看看OpenCL 和 OpenGL 的计算着色器有什么区别?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM