2011-09-06 45 views
3

您可以渲染一個具有不同紋理的四邊形的VBO嗎?現在,我閱讀了關於通過紋理或紋理類別進行排序,但仍然不能回答我的問題。我正在研究2D遊戲。現在我的動畫小精靈會爲它們的框架和一個普通的地圖繪製紋理地圖集,並且它們都將共享相同的VBO(如果可能的話)。所以每個精靈都會有一個atlass(一些動畫可能有很多幀和姿勢,可能會填充4096 * 4096紋理)。那有可能嗎?是或否。如果不是有效的做法是爲每個sprite建立一個帶有所有動畫幀的所有紋理座標的索引VBO,並且每幀僅發送4個索引(對於單個動畫幀)並更改每個VBO的紋理?編輯:其中一些可能會移動(顯然),有些可能不是。具有多個紋理的VBO


想過這一點後,我意識到內存使用也是一個問題。那些質樸的眼鏡會吃掉很多的記憶。一個4096 * 4096 RGBA紋理需要64 MB,這很多(並且沒有正常映射,這會使用量增加一倍)。而且我不認爲我可以將這麼多的動畫塞入一個單獨的類。像Diablo這樣的老遊戲,或者Infinity Engine上的遊戲只需要幾MB的VRAM,而且它們看起來非常棒。

回答

1

當然,這是可能的(假設紋理座標保持不變)。只需使用glBindTexture()即可附加要使用的紋理,並使用glActiveTexture()選擇要修改的紋理單元。

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE2D, texture_texid); 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE2D, normalmap_texid); 
DrawStuff(); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE2D, texture2_texid); 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE2D, normalmap2_texid); 
DrawStuff(); 

顯然glActiveTexture()可以跳過,如果你只使用一個紋理。

+0

感謝您的答案。我的意思是用一個平局電話來畫畫。你的建議看起來與我在帖子末尾所說的相似。 – M3rlyn

+0

而且紋理單位也是有限的。他們還不夠。 – M3rlyn

6

只是爲了澄清,VBO可以包含紋理座標,但不知道將對其應用哪些紋理。

使VBO獨立於紋理,並根據動畫/幀索引計算片段/像素着色器中的紋理座標。假設你在VBO中有四邊形,那麼你設置紋理座標,以便它們映射整個紋理。然後在着色器中,您將縮放並翻譯紋理座標以映射紋理圖集上的單個幀。然後,您可以將動畫索引,圖集中的幀數等作爲統一值賦予着色器。

編輯(以進一步澄清):

紋理座標爲四

(0,1)   (1,1) 
    x-------------x 
    |    | 
    |    | 
    |    | 
    |    | 
    |    | 
    x-------------x 
(0,0)   (1,0) 

這對應於整個紋理映射到這個單一四邊形。

比方說,您的紋理可以方便地分割成16x16「幀」,在紋理圖集中按行列順序堆疊。在u和v中,單個幀的大小因此分別是紋理座標中的1/16。這是你的移動窗口。現在在您的着色器中,傳遞動畫的「幀」數,並且四邊形中每個頂點的紋理座標是它的由16縮放的紋理座標,然後由該幀(基於0的整數)翻譯:

float scale = 0.0625 // 1/16. 
texCoord *= scale; 
texCoord += float2(scale*frame%16, scale*(frame/16)) 

現在我正在寫這篇文章,因此可能會出現一些小錯誤。此外,此代碼假定texCoord是四邊形上片段的紋理座標。請注意,計算1/16一次比重複除以16便宜得多,我可以添加每個像素。如果你還沒有跟蹤我,float2(scale * frame%16,scale *(frame/16))行可能會引起混淆。一個更簡單的情況:

(with a total of 64 frames in an 8x8 grid) 
     frame 0 1 2 3 4 5 6 7 8 9 10 11 12 
x = frame%8 0 1 2 3 4 5 6 7 0 1 2 3 4 
y = frame/8 0 0 0 0 0 0 0 0 1 1 1 1 1  
(note integer division) 
+0

那麼如果你能夠賜教我,我該怎麼做?我將不得不爲每4個頂點給出不同的統一值......這對我來說聽起來不是很有效。我錯了嗎? – M3rlyn

+0

我已經編輯了答案,要更徹底 – edvaldig

+0

我完全明白這一點。但那不是我的問題。我的問題是我如何有效地爲每個四邊形選擇合適的紋理,因爲它們中的每個都要從不同的紋理「剪切」它們的幀。 (不使用glActiveTexture) – M3rlyn