2013-06-27 30 views
1

由於像素緩衝區對象在OpenGL ES 2.0中不可用,將紋理傳輸到GPU(以及再次傳回)的最快方式是什麼?是否有任何可用於iPad 2或更高版本的擴展功能?使用OpenGL ES 2.0傳輸紋理的最快方式是什麼?

不幸的是,我不能使用壓縮紋理作爲紋理(RGBA8)在應用程序的另一部分動態生成。

回答

2

對於iOS(假定引用的iPad在這裏,我假設你是平臺),通過紋理緩存去往未壓縮紋理的最快方式。這些都是在iOS 5.0中引入的,基本上是在紋理的後備字節和本地內存字節緩衝區之間建立直接內存映射。

對於使用CVOpenGLESTextureCacheRef進行上傳,我描述了this answer中的過程。但攝像機有點特殊,因爲它提供了像素緩衝區供您使用。對於其他用途,您將自己創建像素緩衝區,並將內存與本地字節緩衝區關聯以上載到紋理中。在我的基準測試中,初始上傳速度不會快於glTexImage2D(),但我相信後續這些字節的修改速度會更快。

我會談談使用紋理緩存從this answer中的FBO紋理目標進行捕捉的過程。該答案也針對編碼視頻的特定用例,但您可以使用相同的基本原理與您自己的自定義像素緩衝區來提取原始字節。在幾乎所有基準測試中,這都比glReadPixels()快。

最快的路徑當然是不必在CPU和GPU之間來回切換。如果可以,請利用FBO紋理目標和共享組來保留GPU上的所有渲染。

+0

我使用Brad的示例從紋理緩存中獲取GL紋理,這有效地消除了傳輸時間。 –

0

EGL圖像擴展可用於分配帶有可用於直接訪問紋理圖像數據的指針的紋理。通常,這比使用glTexImage2D()快得多。我沒有爲iOS示例代碼,但示例代碼這篇文章爲Linux和Android:

http://software.intel.com/en-us/articles/using-opengl-es-to-accelerate-apps-with-legacy-2d-guis

+1

看起來是一個有趣的閱讀,但EGL/eglext.h似乎沒有出現在iOS上。我在別處也看到了證據(例如https://developer.apple.com/library/ios/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/OpenGLESPlatforms/OpenGLESPlatforms.html)_ iOS沒有支持EGL擴展。 –

+0

這是正確的。 iOS使用Apple EAGL而不是Khronos EGL。 – mchiasson