2013-10-14 25 views
2

在RenderToTexture上下文中,涉及多個着色器,我需要CPU訪問其中一個最終呈現目標。使用glGetTexImage很好,不幸的是它將所有紋理數據複製到客戶端內存。RTT到TEXTURE_BUFFER

爲了避免這個副本,我試圖用TEXTURE_BUFFER到implemnet一個RTT,因此單獨的緩衝區對象連接到一個紋理,使用紋理渲染的部分,然後簡單地使用glMapBuffer映射紋理的數據存儲並使其可供CPU訪問。

除了代碼之外,我想問一下這樣的策略是否可能是正確的(沒有什麼比我更好的了)或者違背了任何規範。

我有很多關於TBO的文檔作爲設置紋理的方法,但沒有關於使用TBOs讀取RTT的結果。我只是想知道,我想要做什麼是不合法的。

+0

爲什麼需要將內容下載到系統內存?也許你可以在GPU上完成這項工作?映射緩衝區通常也會複製。 https://www.opengl.org/wiki/Buffer_Object#Mapping – fen

+0

Im實際上試圖避免複製到系統內存。映射緩衝區對象通常可以解決而不涉及任何複製。不,不能在GPU上工作 – user815129

+0

你也可以看看像素緩衝區對象http://www.songho.ca/opengl/gl_pbo.html,https://www.opengl.org/wiki/Pixel_Buffer_Object – fen

回答

1

不幸的是,這種方法是行不通的。 A buffer texture不是真正的可用作渲染目標或用於2D紋理過濾的純粹2D紋理,如this related question/answer pair中所述。它實際上只是一個緩衝區的數據,可以通過一個着色器作爲線性一維整數索引數組(僞裝成一種特殊的紋理),因此與普通的過濾2D紋理沒有多大關係。它與OpenGL 4稍後作爲shader storage buffer(但是以更加麻煩且只讀的方式在GL 3硬件上提供)或uniform buffer object(但具有更大的尺寸並使用不同的存儲區域)相比更加相似, 。所以不,你不能在FBO中使用TBO作爲渲染目標。

什麼可能是你的選擇將是pixel buffer object (PBO)。雖然這仍然會將紋理內存複製到額外的緩衝區中,但如果正確使用,您仍然可以從異步讀取,特殊的主機可訪問的內存等等中獲益。

+0

謝謝。經過更深入的考慮後,我決定首先由Fen提出建議,並修改渲染管道,以最大限度地實現異步操作。 – user815129