簡體   English   中英

使用具有多個采樣器制服的單個紋理圖像單元

[英]Using a single texture image unit with multiple sampler uniforms

我正在編寫一個批處理系統,它跟蹤當前綁定的紋理,以避免不必要的glBindTexture()調用。 我不確定是否需要跟蹤特定批次已經使用了哪些紋理,這樣如果紋理被使用了兩次,它將被綁定到需要它的第二個采樣器的不同TIU。

OpenGL應用程序是否可以在同一着色器階段為多個采樣器使用相同的紋理圖像單元? 那些不同着色器階段的采樣器呢? 例如:

片段着色器:

...
uniform sampler2D samp1;
uniform sampler2D samp2;

void main() { ... }

主程序:

...
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex_id);
glUniform1i(samp1_location, 0);
glUniform1i(samp2_location, 0);
...

我沒有看到為什么這不起作用的任何原因,但是如果着色器程序還包括這樣的頂點着色器:

頂點着色器:

...
uniform sampler2D samp1;

void main() { ... }

在這種情況下,OpenGL應該將samp1兩個實例視為引用相同的位置。 因此,在頂點和片段着色器中使用相同的紋理單元。 我已經讀過在兩個不同的着色器階段使用相同的紋理對GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS進行雙重GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS但這似乎與此相矛盾。

在我的硬件(HD 6870)上進行快速測試時,以下所有方案均按預期工作:

  • 1個TIU用於同一着色器階段的2個采樣器制服
  • 1 TIU用於1個采樣器制服,用於2個着色器階段
  • 1個TIU用於2個采樣器制服,每個制服發生在不同的階段。

但是,我不知道這是否是我應該期望在所有硬件/驅動程序上的行為,或者是否存在性能影響。

希望這會清除你的一些困惑,我使用舊版本的規范。 為簡單起見,較新版本有兩個額外階段(曲面細分控制/評估),因此討論稍微復雜一些。

OpenGL 3.3(核心專業版) - 2.11。 頂點着色器 - 第80頁

紋理訪問

着色器能夠查找紋理貼圖。 可用於頂點,幾何或片段着色器的紋理圖像單元的最大數量分別是依賴於實現的常量GL_MAX_VERTEX_TEXTURE_IMAGE_UNITSGL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITSGL_MAX_TEXTURE_IMAGE_UNITS 頂點着色器,幾何着色器和片段着色器組合使用不能超過GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS紋理圖像單元的值。 如果頂點着色器,幾何着色器和片段處理階段中的多個訪問同一紋理圖像單元,則每個此類訪問將與GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS限制分開計算。

基於每個階段中使用的唯一采樣器的數量來施加限制。 兩個具有不同名稱但引用相同紋理單元的采樣器制服在使用確定方面實際上是相同的。 用法指的是做一些像texture (sampler, coords) ,如果那不是很明顯的話。 僅僅聲明一個采樣器並為其賦值不會使您更接近實現定義的限制,您實際上必須在運行時使用采樣器,並且它與同一階段中的另一個使用的采樣器具有相同的值它不算數。

至於多次使用相同的紋理對象,這不是GL_MAX_..._IMAGE_UNITS限制的全部內容。 您可以將相同的紋理綁定到所有48個紋理單元(GL3.3中的最低實現要求 - 這有效地要求每個階段至少16個紋理)如果您願意,此限制是指您使用的不同采樣器的數量(再次,請參閱在着色器階段。 實際上,您可能希望將相同的紋理綁定到多個紋理單元,如果您需要使用最近鄰居過濾一次,另一次使用線性或不同的包裹狀態。

如果您想知道所有驅動程序/硬件的行為,請始終參考正式的OpenGL規范。 我為您挑選了相關信息,但是如果您將來了解如何搜索重要細節,那將會很好。 自OpenGL 1.0以來的每個規范都可以從http://www.opengl.org/registry/免費獲得。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM