2014-10-22 112 views
3

gl.glTexImage2D是做什麼用的?文檔說它「上傳紋理數據」。但是這是否意味着整個圖像在GPU內存中?我想用一個大的圖像文件進行紋理映射。此外:我可以簡單地使用VBO來獲取uv和位置座標來繪製紋理嗎?OpenGL glTexImage2D是做什麼的?

對,我在這裏用錯誤的方式說話。我的意思是攜帶一個二維UV座標陣列和一個二維數組模型,將較大的PNG圖像(在紋理內存中)二次採樣到各個瓦片模型上。我這裏的困惑在於不知道這些提取能夠多快。可以說我有一個5000x5000像素的圖像。我將它作爲紋理加載。然後我創建我自己的算法來獲取它的一部分來繪製。我在哪裏可以節省繪製這些瓷磚的帶寬?如果我實現了LOD算法來確定哪些貼圖靠近,哪些遠離攝像機,那麼如何在內存中管理每個貼圖?加載的問題我知道,但我正在努力尋找最好的實施開始。我正在爲使用OpenGL ES 2.0的移動設備開發。

回答

1

你是對的。

glteximage2d是實際將紋理數據移動到GPU的函數。

您需要先使用glGenTextures()創建紋理對象,然後使用glBindTexture()將其綁定。

有這個過程中的OpenGL紅皮書 example

那麼你可以使用這個紋理與VBO一個很好的例子。有很多方法可以實現這一點,但是交織頂點座標,紋理座標和頂點法線,然後告訴GPU如何通過多次調用glVertexAttribPointer來解壓縮它們,這是性能最好的選擇。

您與VBO正處於正確的軌道,舊的固定管道GL的東西被取消,所以你應該從一開始就學習VBO。

這本書是不是100%是最新的,但它是完整的,免費的,應該成爲一個偉大的地方開始學習VBO Open GL Book

+0

謝謝喬納森。我想用一個大的PNG文件來表示地形。爲了補充這個難題,我還在一個稍微粗糙的細節處設置了一個高度值網格。我的想法是使用紋理映射方案將它的紋理分解成瓦片。這是大多數人用於渲染大型地形場景的一般方法嗎?謝謝! – Fra 2014-10-22 02:56:53

+0

@Fra:紋理貼圖不會把事情分解成瓷磚。話雖如此,流血尖端的技術就是走相反的道路,即將許多小質地的瓷磚合併成一個大(稀疏)的質地。現代GPU具有內存管理單元,可以在需要時從CPU內存中獲取所需的紋理部分,並根據需要更換不需要的部分。然而,你需要一個相當新的GPU(2012-ish或更高版本)才能獲得支持。如果要將較大的圖像平鋪到較小的圖塊中,則每個圖塊必須成爲單獨的圖塊,或者使用2D紋理數組。 – datenwolf 2014-10-22 07:54:00

+0

@Fra:你所描述的可能是兩件事之一。如果您正在通過在同一紋理空間內保存多個細節級別來節省繪製時間,那麼MipMapping可能適合您。它在圖像加載時創建圖像的多個縮放副本。如果您正在討論更多基於sprite的引擎,其中單個紋理圖紙用於多個不同的圖像,那麼使您的u,v映射座標是通用的,並使用統一變量(glUniform)來選擇應繪製哪個圖塊。 – Jonathan 2014-10-22 17:14:04

5

當你調用glTexImage2D()到底會發生系統相關,而且也沒有除非你有開發者工具可以讓你跟蹤GPU和內存的使用情況。

唯一可以保證的是,傳遞給調用的數據在調用返回時已被使用(因爲API定義允許您在調用後修改/釋放數據),並且數據可訪問當GPU用於渲染時,將其添加到GPU。在這之間,任何事都是公平的遊戲。請記住,OpenGL是一個非常異步的API。在進行API調用時,相應的工作大部分排隊等待GPU再執行,並且在調用返回時通常不會完成。這可以包括上傳數據的呼叫。另外,並非所有GPU都具有「GPU存儲器」。實際上,如果你按照數量來看待它們,那麼很少有。移動GPU具有緩存,但大多數情況下不是傳統獨立GPU的VRAM。如何管理VRAM和高速緩存是高度依賴於系統的。

以上所有的注意事項,並描繪了一個具有VRAM的GPU:儘管可能他們可以在glTexImage2D()調用中將數據加載到VRAM中,但如果通常這樣做,我會感到驚訝。這對我來說沒有多大意義。加載紋理時,您不知道多久將用於渲染。既然你不知道所有的紋理是否適合VRAM(而且他們通常不會),你可能必須在它被使用之前從VRAM驅逐它。這顯然是非常浪費的。作爲一種常規策略,我認爲只有當您使用繪圖調用時纔將紋理數據加載到VRAM中會更加高效。

如果驅動程序可以非常確定所有紋理數據都適合VRAM,情況會有所不同。但是對於OpenGL,提前知道這一點真的沒有什麼合理的方法。至少在桌面電腦上,事情變得更加複雜,您可以同時運行多個應用程序,而VRAM是共享資源。

+0

+1 - 爲什麼我不能upvote 50次;) – datenwolf 2014-10-22 07:55:45