2013-07-04 83 views
0

我知道在OpenGL程序中可以有GL_MAX_TEXTURE_IMAGE_UNITS紋理單元。但讓我們假設我只使用一個。 假設我有5個2D紋理。我可以將它們「映射」到單個紋理單元(TEXTURE0)來渲染它們全部。 我的意思是,我會做到這一點:我可以使用一個紋理單元5種不同的2D紋理

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, tex1); 
//specify tex data and tex params for tex1 

glBindTexture(GL_TEXTURE_2D, tex2); 
//specify tex data and tex params for tex1 

..等所有5個紋理

渲染循環:

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, tex1); 
//draw 

glBindTexture(GL_TEXTURE_2D, tex2); 
//draw 

..和等所有5個紋理

在片段着色器中,我只使用1個初始化爲零的sampler2d變量(對於紋理單元0)

如果這不能正常工作,那麼我應該使用5個不同的紋理單元(TEXTURE0, TEXTURE0+1, ....TEXTURE0+5)並將每個紋理「映射」到不同的紋理單元。

最重要的問題:如果我的第一個方法是正確的,那麼我可以「映射」到一個紋理單元上多少個2D紋理(現在只允許討論2D紋理)?

+0

咦?你的意思是使用多紋理而不使用多紋理?你想要達到什麼目的?*「map」*對你來說意味着什麼?如果你的片段着色器只有一個'sampler2D',它怎麼能一次使用多個紋理? –

回答

2

嗯,我明白的OpenGL紋理單元:

文本單元是着色器指向紋理採樣的方式。如果着色器必須訪問多個紋理,則必須將它們分爲不同的紋理單元。

就你而言,因爲你似乎只需要1個紋理,glActiveTexture沒用,只需讓Opengl使用默認的GL_TEXTURE0即可。

所以,是的,你的渲染循環是正確的。

紋理單元的極限有多少? 48+,綽綽有餘!

Note: 請記住,OpenGL是一個狀態機,因此要配置多個紋理同時工作,您需要一種方法來選擇它們,這正是glActiveTexture所做的。

我希望它能幫助你。

+0

謝謝阿德里安,我沒有足夠的聲望來投票你的答案,但那太棒了!這些文字讓我非常清楚這個想法:「如果着色器一次使用超過1個紋理,則需要超過1個tex單位」 謝謝! – viktorzeid

+0

@kvikram高興地幫助你:-) –

5

只要你不想在同一塊幾何體上同時使用幾種紋理,這是完全可能的。實際上這是通常要做的事情,因爲多紋理和紋理單元的目的是而不是可以爲不同的對象保留不同的紋理,但在同一對象上使用不同的紋理圖層。

將紋理單元想象爲類似Photoshop中的圖層。