2016-02-02 196 views
1

爲了在SurfaceTexture上執行高斯模糊,我正在執行雙通道渲染,這意味着我將紋理通過一個着色器(水平模糊),然後通過另一個着色器(垂直模糊)。Android:雙重渲染使用OpenGL渲染到SurfaceTexture

我理解這個背後的理論:將第一個紋理渲染到FBO,將第二個紋理渲染到SurfaceTexture本身。

這裏有一些例子,但它們都不適用,因爲SurfaceTexture在glBindTexture中使用GL_TEXTURE_EXTERNAL_OES作爲其目標,而不是GL_TEXTURE_2D。因此,在調用glFramebufferTexture2D時,不能將GL_TEXTURE_2D用作文本目標,我認爲GL_TEXTURE_EXTERNAL_OES不能用於此調用。

任何人都可以提出一種方法來渲染紋理兩次,最終渲染到SurfaceTexture?

重要更新:我使用SurfaceTexture,因爲這是播放到表面上的視頻的動態模糊。

編輯:這個問題被問及我的一些誤解。 SurfaceTexture不是顯示元素。它接收來自曲面的數據,並將其附加到GL_TEXTURE_EXTERNAL_OES。

謝謝。

+0

我一直使用GL_TEXTURE_2D。由於某種原因,這不適合你嗎? –

+0

當我使用GL_TEXTURE_EXTERNAL_OES作爲glBindTexture的目標時,無論我在該調用中使用GL_TEXTURE_2D還是GL_TEXTURE_EXTERNAL_OES,在glFramebufferTexture2D中傳遞相同的紋理名稱時,都會得到無效的操作錯誤。如果glBindTexture中的目標是GL_TEXTURE_2D,綁定似乎可行,但顯然我無法再將FBO渲染到SurfaceTexture。 – Michael

回答

0

渲染到SurfaceTexture在這裏看起來很奇怪。 SurfaceTexture的要點是將任何發送到Surface的東西都轉換爲GLES「外部」紋理。由於您使用GLES進行渲染,因此您可以使用FBO將其渲染爲第二階段的GL_TEXTURE_2D

從相機或視頻解碼器接收幀時使用SurfaceTexture,因爲源通常是YUV。 「外部」紋理格式允許更寬範圍的像素格式,但限制了紋理的使用。如果您的目標是創建GLES紋理,則使用GLES渲染到SurfaceTexture是沒有任何價值的。

+0

我忽略的一個重要細節是,這是一個動態模糊的視頻播放到表面,所以這就是我選擇使用SurfaceTexture的原因。是否有可能渲染兩次,最後渲染到SurfaceTexture,還是需要找到不同的方法? – Michael

+0

因此...視頻解碼器 - > SurfaceTexture,將該紋理渲染爲具有水平模糊的FBO,將FBO渲染爲具有垂直模糊的SurfaceView。 (我們是否使用相同的單詞?SurfaceTexture是一個有效的EGL圖形轉換器,沒有顯示組件,而SurfaceView和TextureView轉到了顯示器上.SurfaceView是用SurfaceTexture實現的,但在這裏並不重要,另請參見https:/ /source.android.com/devices/graphics/architecture.html。) – fadden

+0

@fadden以及如果輸入來自相機?並且GL_TEXTURE_EXTERNAL_OES會被相機更新,並應用雙通道模糊處理。如何用fbo實現這一點? –