2016-05-18 46 views
0

當我們要設置一個紋理爲一個均勻的,我們不能紋理ID綁定到程序,我們必須建立像下面的關係:OpenGL:紋理單元的概念是否冗餘?

textureId < - >紋理單元< - >定製服

「紋理單元」的概念是多少?

這裏有什麼特別的東西可以作爲中介使用嗎?

回答

2

着色器可以訪問的紋理數量有限制(理論上)。這些限制與着色器可以訪問的制服數量和其他參數的限制不同。

此外,通過使紋理對象不是程序狀態的一部分,它允許您更改程序而不用更改正在使用的紋理。兩個不同的程序可以引用相同的紋理單元(例如,陰影貼圖)。用你的方式,我們必須將陰影貼圖附加到每個使用它的程序。按照目前的方式,我們將它綁定一次,並讓程序決定他們使用什麼。

+1

應該指出的是紋理單元和綁定可以通過無紋理紋理訪問來繞開。無結構紋理訪問不是標準OpenGL的一部分,但可通過'ARB_bindless_texture'擴展名獲得。 – datenwolf

+0

@datenwolf我認爲它已經成爲4.5的標準,還是直接訪問的東西不包括? – Xirema

+0

@ Xirema:無結構紋理不是DSA的一部分。由於[並非所有支持4.x的硬件都可以處理它們],因此無結構紋理仍然是一個擴展。(http://opengl.gpuinfo.org/gl_listreports.php?listreportsbyextensionunsupported=GL_ARB_bindless_texture)。或者至少,不是那樣。 –

1

您可以創建一個新的函數來使代碼更簡單,因爲它可能是多餘的,但它也很有用: 紋理單元用於多紋理,並且沒有其他方法可以這樣做。將紋理分配給一個數字非常簡單。然後它允許快速改變紋理。所以即使只有一個紋理,我們也必須做這個鏈接。

但是正如我所說的,需要着色器程序,紋理和紋理單元的一個小函數,那麼它就沒問題,只有1行可以使它工作。