2012-01-26 61 views
3

我知道如何以相反的方式做到這一點。但是我怎樣才能從紋理創建一個CIImage,而不必複製到CPU內存中? [CIImage imageWithData]? CVOpenGLESTextureCache?如何將OpenGL ES紋理轉換爲CIImage

+0

只是一個用於iOS 6的更新,這是現在可能。 – akaru

回答

4

不幸的是,我不認爲有什麼辦法可以避免使用glReadPixels()回讀像素數據。 CIImage(data,CGImageRef,CVPixelBufferRef)的所有輸入都是CPU端的,所以我沒有看到將其傳遞給CIImage的快速路徑。它看起來像你最好的選擇,將使用glReadPixels()從紋理中提取原始RGBA數據,並使用-initWithData:options:kCIFormatRGBA8像素格式將其發送到CIImage。 (更新:2012年3月14日)在iOS 5.0上,現在有一種更快的方式來使用新紋理緩存來獲取OpenGL ES幀數據。我在this answer中詳細描述了這一點。

但是,可能有另一種方法來實現你想要的。如果您只是想在紋理上應用濾鏡以輸出到屏幕,則可以使用my GPUImage framework來執行處理。它已經使用OpenGL ES 2.0作爲其渲染管線的核心,紋理就是將圖像或視頻幀從一個過濾器傳遞到下一個過濾器的方式。在我的基準測試中,它也比Core Image快得多。

您可以在此處提供您的紋理作爲輸入,以便它永遠不必觸碰CPU。我還沒有從OpenGL ES獲取原始紋理的庫存類,但您可以修改現有GPUImageOutput子類之一的代碼,以便將其用作源代碼。然後你可以鏈接過濾器,並將輸出指向屏幕或靜止圖像。在某些時候,我會爲這種數據源添加一個類,但是這個項目還是相當新的。

+1

謝謝,布拉德。你使用過CVOpenGLESTextureCache嗎?似乎應該是glReadPixels的替代方案,如果沒有其他方法。有一種方法只是針對我在OS X上的問題,似乎必須有一種方式,因爲蘋果如何專注於GPU ...... – akaru

+0

@akaru - 除非我遺漏了一些東西,否則CVOpenGLESTextureCache僅僅用於單向上傳快速的紋理。我不認爲它可以用於從OpenGL ES紋理中讀取任何東西。我還沒有看到在頭文件或蘋果公司關於該主題的演示文稿中提到這一點。我認爲我們堅持在iOS上使用'glReadPixels()'。 –

+0

@akaru - 我找不到關於這個的早期問題,但事實證明我錯誤地認爲紋理緩存是單向的。我只是讓他們工作來編碼視頻,他們比'glReadPixels()'快:http://stackoverflow.com/a/9704392/19679 –