2012-08-02 109 views
1

紋理單元,每個程序中的OpenGL ES 2.0根據蘋果的文檔,支持OpenGL ES 2.0的限制: "You can use up to 8 textures in a fragment shader."澄清在iOS

這似乎並不顯着特定的,所以我認爲它的意思,「你可以爲您的片段着色器的每次傳遞引用最多8個紋理單位。「

所以,我一直在做的,就是在我的片段着色器給定的傳球,我只引用一個紋理單元,開始紋理單元0。下一次,我引用單元1下傳,單元2 , 等等。根據我上面的假設,這應該做工精細長達GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS.

然而,它只是似乎工作,直到單元7,並且在任何突破> =單元8

聽起來是不是像這樣將導致我打到最大的紋理單位?或者我錯過了什麼?

如果我確實打在片段着色器允許紋理單元的上限,我想我會做什麼時持有程序的可變數組,當我需要多少個紋理在運行時生成的許多方案我已經定義了,當我點擊8的倍數的紋理單元索引時,切換到相應的程序。

這聽起來是合理的,還是我失去了一些東西?

+ (GLint)maximumTextureUnitsForThisDevice; 
{ 
    GLint maxTextureUnits; 
    glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &maxTextureUnits); 
    return maxTextureUnits; 
} 

最強大的設備我有上運行此,視網膜的iPad,我得到最多8個紋理:

+2

如果每個通行證只能使用一個紋理,那麼爲什麼不直接綁定後,每次一個新的紋理通?我很困惑,爲什麼你認爲你需要不斷增加紋理單元編號。 – Tim 2012-08-02 03:53:47

+0

太棒了!因爲我的理解完全錯誤。我認爲將紋理分配給給定的單元會導致將紋理數據發送到opengl的成本,所以我不想在使用紋理時切換單位。現在我總是使用unit 0,它可以解決我在> 8時遇到的任何問題。我正在慢慢爬上學習曲線,所以感謝您指出了這一點。 – jankins 2012-08-02 17:13:33

回答

1

您可以通過類似下面的查詢紋理單元的最大數量的設備上單位。這意味着你將無法將紋理綁定到GL_TEXTURE7以上的任何紋理,並且可以將着色器中的同時紋理數量限制爲8個。

但是,正如Tim在他的評論中所建議的那樣,如果你只是需要在同一時間訪問一個紋理,並沒有什麼東西每個紋理只是順序結合至單一單元,處理它,然後結合接下來的質感同單元阻止你。

+0

感謝您的代碼片段,看起來像這將是所有glGet的有用。所以可以予安全地假定紋理的數量我可以用來繪製一幀,只要我從未引用超過8個紋理一個片段着色器通,僅由我在設備的存儲器約束的限制?如果我有這個權利,事情可能會開始有意義。 – jankins 2012-08-02 17:28:07

+0

@jankins - 是的,如果你在多個步驟中進行渲染。紋理單元限制僅影響您將多個紋理饋送到單個渲染通道的能力。 – 2012-08-02 17:31:08