2012-02-13 59 views
5

在iOS 5中,OpenGL ES的紋理緩存被引入提供攝像頭的視頻數據到OpenGL的一個直接的方式,而不需要複製緩衝區。有一個session 414 - Advances in OpenGL ES for iOS 5 of WWDC 2011的紋理緩存簡要介紹。使用OpenGL ES的紋理緩存,而不是glReadPixels獲得的紋理數據

我發現了一個有趣的article,它最終會進一步濫用這個概念,並通過簡單地鎖定紋理,然後直接訪問緩衝區來繞過對glReadPixels的調用。

glReadPixels實在是太慢了,由於這是在iPad 2的(即使只使用1x1的紋理)使用基於區塊的渲染器。但是,所描述的方法似乎處理得比glReadPixels更快。

的文章中所提出的方法,即使有效,可以把它用來提高依賴於glReadPixels應用程序?

由於OpenGL的在CPU並行處理圖形數據時,CVPixelBufferLockBaseAddress電話怎麼會知道當渲染,無需與OpenGL做的?

回答

4

我在this answer的基礎上描述了一種方法,基於您的上面鏈接的文章和來自WWDC 2011的Apple ChromaKey樣本。鑑於Apple在其中一個樣本中使用了這一點,並且我沒有聽到任何反駁從他們的OpenGL ES工程師,我認爲這是紋理緩存的有效使用。它的工作原理,我試過每部iOS 5.x的兼容設備上,並在安裝iOS 5.0和5.1的作品一樣好。它比glReadPixels()快得多。至於何時鎖定像素緩衝區基地址,您應該能夠使用glFlush()或類似的東西來阻止,直到所有數據都已經渲染到您的FBO紋理爲止。這似乎適用於我從紋理支持的FBO完成的30 FPS 1080p電影編碼。