2014-04-30 183 views
7

我想創建一個SurfaceTexture與我可以管理的OpenGL紋理,在類似於this answer設置。 (這裏引用:)Android:是否可以在沒有SurfaceView的情況下創建SurfaceTexture?

  1. 通過OpenGL的
  2. 創建紋理通過這個紋理新表面紋理的構造。
  3. 將此新SurfaceTexture賦予相機。
  4. 確保您使用的是OES_External(請參閱文檔 的詳細信息)。

然而,創建一個OpenGL質地(如在回答的步驟1)中,需要一個EGL上下文,這需要進行電流的EGLSurface,這需要一個表面紋理。看起來創建EGL上下文的唯一方法是創建一個SurfaceView(或具有SurfaceTexture的另一個視圖),並使用它來初始化EGLSurface,然後使EGLContext處於最新狀態。

我的目標是創建一個EGLContext並使其在後臺線程中處於當前狀態,以在相機預覽圖像上執行一些離屏計算(主要使用NDK)。我想創建一個庫,並儘可能獨立於UI。兩個相關的問題:

在Java方面,是否有可能創建一個EGLContext,而無需事先創建SurfaceTexture?

在NDK方面,曾經有一個私人API調用來創建本機窗口android_createDisplaySurface(),但它不再工作,而且它是一個私有API。有沒有用NDK創建曲面的方法?

我很新的使用EGL,我不明白爲什麼你需要一個EGLContext來進行電流的EGLSurface。在iOS中,可以首先創建EAGLContexts,然後可以根據需要創建幀緩衝區。使用EGL似乎你總是需要一個本地窗口。

回答

4

您可以在Grafika中看到許多操作攝像頭輸出,SurfaceTexture和EGL的示例。 「連續捕捉」活動只有一個,但它使用了您提到的技術:避免創建EGLSurface,它只是借用附近SurfaceView中的一個。

您確實需要有一個EGLSurface,但它不需要是一個窗口表面。您可以創建一個1x1 pbuffer表面並使用它。這是通過撥打eglCreatePbufferSurface()來完成的;以Grafika中的EglCore類爲例。

這些示例是用Java編寫的,但Java實現只包裝本地EGL/GLES調用。

android_createDisplaySurface()是一個內部呼叫,正如您發現的,它不適用於較新的設備。改爲搜索NDK的ANativeWindow

更新:的人誰在這裏得到通過搜索,android_createDisplaySurface()依賴於所謂的FramebufferNativeWindow一個內部類,這是在this change標註的是Android 5.0過時。使用它的內部OpenGL ES測試代碼已在this change中用基於SurfaceFlinger的替換更新。原始版本的測試代碼需要關閉Android應用程序框架,以便抓取幀緩衝區;新版本只是要求SurfaceFlinger提供一個覆蓋屏幕的窗口,並將其合成到其他所有窗口之上。

+0

非常感謝。我一直在使用ANativeWindow_fromSurface(),它工作的很好,但它仍然需要Java方面的Surface。我會嘗試使用pbuffer選項。我在另一個問題中讀到Pbuffers不適用於所有設備,是對的嗎? – user1906

+0

我不知道pbuffers的問題。 – fadden

+0

@ user1906:你有沒有得到這個工作? –

相關問題