2014-01-10 68 views
0

我有一個對象類型,根據旋轉(模擬3D)將紋理呈現(正確)到2D網格上。但是,爲每個視圖加載/綁定新的紋理圖像都很慢。禁用視圖相關的紋理加載可以獲得非常快的性能。OpenGL紋理加速 - 查看相關紋理

緩衝對象的所有視圖/紋理可能不是一個好選擇,它可能包含720個視圖(單獨圖像)的順序,每個視圖可能是600x1000像素。也沒有最終用戶系統規格的保證,這是一個外設應用程序。

在按需加載紋理和一次緩衝所有視圖紋理之間,是否有任何好的中間OpenGL建議?

+1

您是否正在從文件加載紋理?如果是這樣,你還在另一個線程上執行該操作(圖像解壓縮,而不是紋理上傳)?你可以忍受多少延遲? – genpfault

+0

作爲genpfault問題的一個後續:如果您不是從磁盤加載它們,而是在運行時生成它們,有沒有什麼辦法可以將該過程轉移到GPU,通過中間渲染來渲染場景中的紋理? – Tommy

+0

是的,他們來自一個文件。目前我在一臺體面的機器上運行2-5 FPS,我想至少在平庸的機器上翻一番。 – Meep

回答

2

這是有用的,有一個紋理緩存,並加載720個不同圖像的所有最低分辨率的MIP級別。這將是您的1x1,2x2左右的分辨率圖像。

當您在視圖中檢測到更新時,您正在更新紋理緩存,優先使用上次使用的紋理,以便當前處於視圖中的紋理具有高優先級,而長時間未使用的紋理將具有最低優先級。

隨着紋理的優先級增加,您將引入紋理的更高細節MIP級別,並且可以在完成加載時重新綁定紋理,紋理高速緩存將在單獨的線程中異步加載它們,然後通知主線程他們可以按照需要在與GL上下文相同的線程中進行準備。

還有一些其他的方法可以用像Partially Resident Textures from AMD這樣的新擴展來做到這一點,但是擴展有一些限制,使它使用起來有點麻煩。

+0

我想避免AMD的實現,不保證用戶硬件或功能。紋理緩存的想法可以在一定程度上工作,我認爲(不會打擾如此低的1x1,但加載低分辨率版本是有道理的)。是否在紋理加載調用時確定mip分辨率? – Meep

1

如果旋轉平滑且速度較慢,則可以根據視圖和預取周圍視圖的數據來從磁盤流式傳輸數據。

如果你能負擔得起有損壓縮,你可以把大量的數據放入RAM中,然後把它移到VRAM(如果可能,用DXT/BC壓縮)。

您應該檢查這些文章:

JMP範Waveren。實時紋理流式解壓縮&。 Intel Software Network,2006。

JMP Van Waveren。地理空間紋理流緩存 設備。 Intel Software Network,2008.

J.P. van Waveren。 ID技術5挑戰:從紋理虛擬化到 大規模並行化。 SIGGRAPH Talk,2009.