我知道如何以相反的方式做到這一點。但是我怎樣才能從紋理創建一個CIImage,而不必複製到CPU內存中? [CIImage imageWithData]? CVOpenGLESTextureCache?如何將OpenGL ES紋理轉換爲CIImage
回答
不幸的是,我不認爲有什麼辦法可以避免使用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子類之一的代碼,以便將其用作源代碼。然後你可以鏈接過濾器,並將輸出指向屏幕或靜止圖像。在某些時候,我會爲這種數據源添加一個類,但是這個項目還是相當新的。
謝謝,布拉德。你使用過CVOpenGLESTextureCache嗎?似乎應該是glReadPixels的替代方案,如果沒有其他方法。有一種方法只是針對我在OS X上的問題,似乎必須有一種方式,因爲蘋果如何專注於GPU ...... – akaru
@akaru - 除非我遺漏了一些東西,否則CVOpenGLESTextureCache僅僅用於單向上傳快速的紋理。我不認爲它可以用於從OpenGL ES紋理中讀取任何東西。我還沒有看到在頭文件或蘋果公司關於該主題的演示文稿中提到這一點。我認爲我們堅持在iOS上使用'glReadPixels()'。 –
@akaru - 我找不到關於這個的早期問題,但事實證明我錯誤地認爲紋理緩存是單向的。我只是讓他們工作來編碼視頻,他們比'glReadPixels()'快:http://stackoverflow.com/a/9704392/19679 –
您可能會發現這些有用的:
- https://developer.apple.com/library/ios/#samplecode/RosyWriter/Introduction/Intro.html
- https://developer.apple.com/library/ios/#samplecode/GLCameraRipple/Listings/GLCameraRipple_RippleViewController_m.html
總的來說,我認爲圖像數據將需要從GPU到CPU複製。但是,上面提到的iOS功能可能會使這更簡單,更高效。
隨着iOS 6後,您可以使用內置的這種情況下,init方法:
initWithTexture:size:flipped:colorSpace:
- 1. 將FFmpeg幀轉換爲OpenGL ES紋理
- 2. OpenGL ES的旋轉紋理
- 3. 如何將OpenGL紋理轉換爲CUDA紋理?
- 4. 訪問OpenGL紋理作爲CIImage
- 5. OpenGL ES 2.0紋理
- 6. OpenGL ES iPhone紋理
- 7. 如何在使用`glTexImage2D`將`CVImageBufferRef`轉換爲OpenGL ES紋理時擺脫文物?
- 8. 將OpenGL紋理轉換爲OpenCV Mat
- 9. OpenGL紋理轉換
- 10. Android OpenGL ES 2紋理象限旋轉
- 11. OpenGL ES 1.1 2D紋理紋理iPhone
- 12. OpenGL ES,你如何渲染PVR紋理?
- 13. Opengl ES - 如何合併程序紋理
- 14. 如何在OpenGL ES 2.0中將紋理繪製爲2D背景?
- 15. 如何使用OpenGL ES 2將紋理繪製爲四邊形?
- 16. 如何在Android OpenGL ES 1.1中將文本顯示爲紋理?
- 17. 設置OpenGL ES 2.0紋理
- 18. opengl es 2.0紋理座標
- 19. Opengl-es繪製紋理
- 20. OpenGL ES紋理遮罩
- 21. OpenGL es 2.0 Android紋理
- 22. OpenGL ES紋理內存
- 23. 的OpenGL ES:避免紋理
- 24. OpenGL ES - glImageProcessing - 刪除紋理
- 25. OpenGL ES:紋理平面
- 26. Android OpenGL - ES紋理出血
- 27. OpenGL ES 2.0 - 畫紋理?
- 28. 的OpenGL ES 2.0:在紋理
- 29. 禁用opengl es紋理ios
- 30. OpenGL ES 2.0衍生紋理
只是一個用於iOS 6的更新,這是現在可能。 – akaru