簡體   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