2017-02-28 68 views
0

我設法寫了一個在TextureView上顯示3D模型的演示,模型可以根據手機的傳感器移動。 3D引擎是由C++編寫的,我需要做的是將TextureView的SurfaceTexture賦予3D引擎。 引擎調用函數ANativeWindow_fromSurface來檢索本機窗口並在其上繪製3D模型。 3D引擎不是我想在這個問題中討論的重點。將TextureView上顯示的記錄幀顯示爲mp4

現在我想記錄的移動3D模型的視頻。一種方法是像使用grafika一樣使用GL_TEXTURE_EXTERNAL_OES紋理,在每次調用updateTexImage()之後,使3D引擎對oes紋理繪製幀並繪製紋理內容,但對於某些限制,我不允許使用這種方式。

我打算直接使用TextureView的表面紋理。我認爲像attachToGLContext()和detachFromGLContext()這樣的函數對我的工作將會很有用。

任何人都可以給我一些建議嗎?

+0

@fadden 能給我一些幫助嗎? – dragonfly

+0

attach/detach調用會更改SurfaceTexture輸出可用的EGL上下文。對於屏幕和視頻編碼器,使用單個EGL上下文通常更容易(如「連續捕獲」)。 「記錄GL應用」代碼顯示了三種不同的渲染屏幕和視頻的方式;這些不起作用? – fadden

+0

@fadden在「記錄GL應用程序」中,形狀是由您的java代碼生成的,您可以控制它們繪製到屏幕和編碼器。但在我的情況下,形狀是由3D引擎產生的,我不允許直接控制形狀。我只能在java層上做,並且框架已經寫入TextureView的surfacetexture中。 – dragonfly

回答

0

Grafika的 「記錄GL應用程序」 具有操作的三種不同的模式:

  1. 繪製兩遍。
  2. 渲染到屏幕外pbuffer,然後blit兩次。
  3. 繪製一次,然後在幀緩衝區之間複製(需要GLES 3)。

如果您可以配置渲染到的EGL表面,則方法2和3將起作用。對於方法#3,請記住,在您撥打eglSwapBuffers()之前,像素不會進入Surface(這是Android Surface,而不是EGL表面)。

如果發動機代碼管理EGL表面,並調用eglSwapBuffers()你,那麼事情有點更惱人。 SurfaceTexture attach/detach調用將允許您使用來自不同EGL上下文的輸出來訪問GLES紋理,但渲染線程在呈現View UI時需要該紋理。我不完全確定這將如何解決。

+0

我認爲方法2將是一個不錯的選擇。但對我而言,更好的方法可能是這樣的:我創建一個OES SurfaceTexture並將其提供給3D引擎(我必須這樣做,這違反了我的原始計劃),將surfaceTexture賦給3D引擎。幸運的是,我可以修改3d引擎的平臺代碼。我確定必須修改它並使本機窗口成爲屏幕外的窗口。你能看看平臺代碼並給我一些建議嗎? – dragonfly

+0

的過程如下: 步驟1.創建ANativeWindow_fromSurface代碼的窗口:http://www.paste.org/83858 步驟2.使用窗口來創建EglSurface代碼:HTTP://www.paste。組織/ 83856 步驟3進入循環代碼的消息循環和swapbuffer:http://www.paste.org/83859 – dragonfly

+0

我覺得eglSurface可能不匹配與OES質感。也許我應該把它改成eglCreatePbufferSurface。請給點幫助,謝謝! – dragonfly