2014-07-08 57 views
3

我正在嘗試使用OpenGL繪製四軸飛行模型。 quadcopter對象有一個.obj文件,一個.mtl文件和三個用於紋理化的.tga文件(一個用於轉子,一個用於機身,一個用於槍支)。OpenGL - 加載具有多個紋理的物體

我的問題是我不知道如何在對象上應用這三個紋理。我應該把對象分成三部分。有沒有更簡單更有效的方法?

回答

2

obj的看起來大致是這樣的......

#all vertex data (for all materials) 
v 0.020542 1.017087 -0.056279 
v -0.000138 0.971408 -1.947060 
v 0.017678 -0.000000 -0.017678 
... 
usemtl material_rotors 
#all faces with rotor material 
f 125/185/28 142/184/3 127/183/3 
f 126/186/29 138/187/29 143/188/28 
usemtl material_body 
#all faces with body material 
f 150/190/32 132/191/32 138/192/29 
f 150/190/32 138/192/29 126/193/29 

可以存儲在同一個網格對象的一切,而不是分裂本身,而是使用獨立的繪製調用。例如:

foreach (material in model.materials) 
    material.bind() //binds textures, sets colours, shader uniforms etc 
    glDrawElements(GL_TRIANGLES, material.indexCount, GL_UNSIGNED_INT, model.bufferStart + material.startIndex) 

這是相同的作爲處理整個OBJ作爲一個模型,除了你跟蹤哪些面繪製與特定材料和在繪製該範圍面的結合適當的紋理。

您可以找到一種方法來包含每個人的材質信息並且一次綁定所有的紋理,但這隻會引入不必要的內存和處理開銷。我猜想如果網格有大量不同的材質,那麼它可能開始更有效地存儲每個頂點的材質參數並使用單個繪製調用,但這是一個非常極端的假設。

3

最簡單的方法將對象拆分爲三個不同的對象,否則您需要一些方法來識別紋理座標採樣的紋理。這將需要模型中每個頂點的附加信息。

我對obj格式不太熟悉,但是大多數格式都是將不同材質的不同對象合併到不同的網格中,每個網格都引用單個材質。