2014-04-27 72 views
2

我不太明白有什麼區別。 我知道TMU是GPU上的紋理映射單元,在opengl中,我們可以有很多紋理單元。我曾經認爲它們是相同的,如果我有n個TMU,那麼我可以有n個GL_TEXTURE使用,但是我發現這可能不是真的。 最近,我正在研究一款安卓遊戲,針對的是使用Mali 400MP GPU的平臺。根據該文檔,它只有一個TMU,我認爲我一次只能使用一種紋理。但令人驚訝的是,我可以使用至少4個紋理沒有麻煩。這是什麼? 硬件或驅動程序級別是否爲我自動交換不同紋理進/出自動?如果是這樣,是否會導致很多緩存未命中?TMU和openGL的GL_TEXTUREn有什麼區別?

回答

1

我不是最終的硬件架構專家,特別是不是馬裏。但根據我的理解,無論如何,我會給它一個鏡頭。

TMU是用於紋理採樣的硬件單元。它不會永久分配給OpenGL紋理單元。任何時候着色器執行紋理採樣操作時,我都希望將此特定操作分配給其中一個TMU。 TMU然後執行請求的採樣,將結果傳送回着色器,並可用於下一個採樣操作。

因此,TMU數量和支持的OpenGL紋理單元數量之間沒有關係。可以支持的OpenGL紋理單元的數量由硬件的狀態跟蹤部分決定。

TMU的數量對性能有影響。可用的TMU越多,在給定時間內就可以執行的紋理採樣操作越多。所以如果你在你的着色器中使用了大量的紋理採樣,你的代碼將從擁有更多的TMU中獲益。如果您從相同紋理或許多不同紋理中進行多次採樣,則無關緊要。

2

紋理映射單元(TMUs)是硬件上的功能單元,曾經一度與像素管線的數量直接相關。由於硬件現在更加抽象/通用,因此它不再是一次可以應用多少紋理的好方法。它可能會給出整體多紋理性能的指標,但本身並沒有強加任何限制。

OpenGL的GL_TEXTURE0+n實際上代表紋理圖像單元(TIU),它是您綁定紋理的位置。您可以同時應用的紋理數量(在着色器的單次執行中)隨每個着色器階段而變化。在GL GL中有5個階段的桌面GL中,實現必須支持每個階段的16個獨特紋理。這就是爲什麼紋理圖像單元的數量是80(16x5)。 GL 3.3只有3個階段,其最小TIU計數僅爲48個。這爲您提供了足夠的綁定位置,爲您的GLSL程序中的每個階段提供了一組16個獨特的紋理。


GL ES,特別是2.0,是一個完全不同的故事。它要求在頂點着色器中至少支持片段着色器階段中的同步紋理和至少(可選)。

const mediump int gl_MaxVertexTextureImageUnits = 0; // Vertex Shader Limit 
const mediump int gl_MaxTextureImageUnits   = 8; // Fragment Shader Limit 

const mediump int gl_MaxCombinedTextureImageUnits = 8; // Total Limit for Entire Program 

還有你可以在你的程序(gl_MaxCombinedTextureImageUnits)的單次執行所有着色器的應用紋理的數量限制,這個限制是通常只是總和的限制爲每個單獨的階段。