2012-04-23 40 views
2

我正在完成wavefront對象分析器,我想用它來構造通用網格對象。我的引擎使用OpenGL 4和着色器在我的引擎中繪製所有內容。將OpenGL中的網格渲染爲一系列子組?

我的問題是關於如何確保渲染網格的最佳渲染效率。

A wavefront .obj file通常有許多指定的對象子組。

子組可能被分配了特定的材料(例如閃亮的紅色)。

所以網格可能是一個相當複雜的子組集合,每個子集都有自己的材質分配。

我的問題是 -

問:我需要繪製每個子組分別例如調用glDrawElements爲每個子組? (所以,如果我有4個獨立的子羣體,我不得不提出四個glDrawElements調用,從而調用着色器的4倍與4個均勻變化(材料/紋理))

glDrawElements(GL_TRIANGLES, nNumIndicesInGroup, GL_UNSIGNED_INT, ((char*)NULL)+ first-vertex-offset); 

如果這是正確的,然後我將不得不計算:

每個子組中的子組的開始的偏移索引(意味着單獨的索引陣列和VAO對於每個子組) 頂點

這看起來非常低效,我吠叫錯了樹嗎?

此外,從Wavefront obj wiki page

Smooth shading across polygons is enabled by smoothing groups. 
s 1 
... 
    # Smooth shading can be disabled as well. 
    s off 
    ... 

任何人都可以提出什麼平滑陰影值說明什麼?例如。 s1,s2,s4等

+1

這個問題,如上所述,如果不知道更多關於頂點數據是什麼以及您將如何處理的問題,就不能回答這個問題。材料,着色器等問題都會影響性能。 – 2012-04-24 00:14:22

回答

9

是的,你應該把每個子組與其他子組分開。這是需要的,直到國家之間的分組不同。

但是你正在做出太長的一步。

爲了避免多次繪製調用,您可以引入一個頂點屬性,指示用於訪問統一數組值的索引(材質數組,材質數組)。這樣,您只需要一次繪製調用,但您將需要一個額外屬性及其相關管理的成本。

我會避免上述方法。如果一個小組有紋理而另一個不是呢?你如何區分是否質感?介紹其他屬性?似乎令人困惑。

第一點是緩衝區對象管理非常靈活。事實上,你可以有一個單一的元素緩衝區對象和一個頂點緩衝區對象:使用偏移量和交織可以滿足每一個複雜程度。然後,在現代硬件上,使用頂點數組對象可以最大限度地降低不同緩衝區綁定的成本。

第二點是您的軟件可以將具有相同統一狀態的不同子組分組,並將多個繪製調用合併爲一個。請記住,您可以使用Multi繪製入口點變體,並且還有可以幫助您的原始重新啓動(在剝離原語的情況下)。

其他考慮因素並非有用,因爲無論如何你都必須畫畫,無論它是否複雜。接下來,當你有一個正確的渲染,你可以剖析應用程序和渲染,切斷熱點。


平滑組是共享相同選項屬性(法線,紋理座標)的頂點的集合。這是元素索引頂點的情況。

要深入瞭解主題,請閱讀使用Google搜索找到的specification之一。

+0

嗨,感謝您的回答,當我獲得所需的15個聲望點時,我會加快響應。 – fishfood 2012-04-25 22:17:39