2013-04-18 101 views
0

我是否理解正確的話,典型的方式繪製多個對象,每個都有不同的紋理在OpenGL是簡單地在同一時間使用glBindTexture一個紋理結合和借鑑使用它的對象,然後將其綁定一個不同的紋理,並做同樣的事情?繪製多個對象不同質地

換句話說,只有一個紋理可以是在任何特定時間繪製「活動」,並且是指使用glBindTexture結合的最後的紋理。它是否正確?

回答

9

使用glBindTexture一次綁定一個紋理並繪製使用它的對象,然後綁定不同的紋理並執行相同的操作?

換句話說,只有一個紋理可以是在任何特定時間

繪圖「主動」這兩句話是不一樣的事情。

單次渲染操作在任何時候都只能使用紋理的單個集合。該集合由當前綁定到各種紋理圖像單元的紋理定義。可用的紋理圖像單元的數量可通過GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS進行查詢。

所以多個紋理可以爲單個描繪命令是「有效的」。

然而,這並不同樣的事情結合了一堆紋理,然後渲染多個對象,每個對象只使用一些(或一個,你的情況)的約束紋理。你可以這樣做,但真的,沒有多少意義。

一個GLSL採樣器和紋理圖像單元之間的關聯是程序對象的狀態的一部分。這是the value you set on the sampler uniform。因此,爲了做你的建議,你必須綁定一堆紋理,將制服設置爲其中一個,渲染,然後將制服設置爲下一個,渲染等。

你還在發生所有綁定這些紋理的成本。你仍然要承擔更換制服的所有開銷。事實上,它可能效率較低,因爲正常的方式(綁定,渲染,綁定,渲染)不涉及改變統一狀態。

此外,它只是很奇怪。一般來說,你不應該動態地改變統一的採樣器狀態。你定義了一個簡單的約定(漫反射紋理來自單元0,單元1反射等),並且你堅持那個約定。任何GL 3.x級硬件都需要提供不少於48個紋理圖像單元(每個階段16個),所以它不會像您將要用完的一樣。

有機制做的事情並不完全不像你在說什麼。例如,array textures可以被利用,雖然這需要明確的着色器邏輯和支持。這幾乎肯定會比「綁定一堆紋理」方法快,因爲你只能綁定一個。此外,你會改變的制服是一個規則的數據統一,而不是採樣員制服,這可能會更快。

與陣列質感機制,你還可以利用instancing,假設你呈現相同的對象略有不同的參數。