2012-10-23 96 views
2

我有一個專門的渲染應用程序,需要從pdf中加載任意數量的jpeg,然後將這些圖像寫入內核中的渲染頁面。這太簡單了,但重點是我想要找到一種方法來集體發送'n'圖像作爲紋理,然後在內核中爲tex2d()調用索引這組紋理。任何想法歡迎這樣做優雅。批量紋理上傳

作爲一個側面的問題,我還沒有找到解碼內核中的jpeg圖像的方法,迫使我在CPU上解碼,然後發送(緩慢)一個大的位圖。我能改善嗎?

回答

1

首先:如果紋理上傳性能不是瓶頸,請考慮不批量上傳。這裏有一些建議,每個都有不同的權衡。

  1. 對於不同大小的紋理,可以考慮創建一個texture atlas。這是遊戲開發中流行的一種技術,它將許多紋理打包成單個2D圖像。這要求將紋理座標偏移到所討論的圖像的角落,並且它排除了使用紋理座標夾緊和包裹。所以你需要存儲每個子紋理的角落偏移量而不是它的ID。有各種工具可用於創建紋理圖集。

  2. 對於不變大小的紋理,或者您不介意浪費不同大小的紋理的情況,可以考慮使用layered texture。這是一個具有多個獨立圖層的紋理,可以使用單獨的圖層索引在紋理獲取時間對其進行索引。從上面的鏈接引用:

    的一維或二維層狀紋理(也稱爲在Direct3D紋理陣列和在OpenGL陣列紋理)是由層的序列的紋理,所有這些都是具有相同維度,大小和數據類型的常規紋理。

    使用整數索引和浮點紋理座標來尋址一維分層紋理;該索引表示該序列內的一個層,並且該座標對該層內的紋理元素進行尋址。使用整數索引和兩個浮點紋理座標來尋址二維分層紋理;索引表示序列中的一個層,座標表示該層內的紋理元素。

    通過使用cudaArrayLayered標誌(以及一維分層紋理的零高度)調用cudaMalloc3DArray(),分層紋理只能是CUDA數組。

    使用tex1Dlayered()和tex2Dlayered()中描述的設備函數獲取分層紋理。紋理過濾(請參見紋理拾取)僅在一個圖層內完成,而不是跨層完成。

    分層紋理僅在計算能力2.0和更高的設備上受支持。

  3. 你可以考慮一種混合的方法:紋理成大小相同的組進行排序和使用分層紋理每個組。或者使用分層紋理圖集,其中組包裝使得每個圖層包含來自每個組的一個或幾個紋理以最小化浪費。

關於你身邊的問題:一個google search for "cuda jpeg decode" turns up a lot of results,包括at least one open source project

+0

令人印象深刻的快!然而,我面對不同大小的圖像,我雖然排除使用分層紋理? – sedona2222

+0

然後再次,也許我可以設置分層紋理到最大的圖像,併發送各種尺寸以及...... – sedona2222

+0

我意識到這一限制,但沒有其他*內置*的方式在CUDA批量上傳2D紋理數據,除了分層或3D紋理。我編輯了我的答案,添加了另一個選項「紋理地圖集」。 – harrism