2013-09-27 23 views
3

要在OpenGL中繪製,您需要指定一個頂點數組,然後使用索引將頂點數組連接在一起,形成基本的語法順序。你可以用glDrawElements來做到這一點。要指定頂點,您可以使用glVertexPointer,您可以在其中指定一個參數「stride」 - 數組中連續元素之間的間隔(即,如果將頂點存儲在包含其他數據的結構中,則可以跨越其他數據)。在OpenGL中,你如何指定步伐?

這很好,但現在我使用的是Assimp,它指定了它在一個face結構中的索引。

struct aiFace { 
    unsigned int* indices; 
    unsigned int numIndices; 
} 

推測這是爲了支持具有不同大小的面(具有三角形和四邊形的網格)的網格。 Assimp非常好,可以選擇對所有網格進行三角剖分,所以我可以保證所有的面都是相同的原始圖。

因此,我真正想要的是能夠邁出我的指標,因爲這樣的:

gl/*...uh...*/ElementPointer(
    3, 
    GL_UNSIGNED_INT, 
    sizeof(unsigned int) /* skip past the num_indices field*/, 
    &faces[0]); 

但我無法弄清楚如何做到這一點。 glDrawElements假定索引是一個連續的數組。有沒有辦法在OpenGL中做到這一點?

回答

1

對不起,您不支持內置於OpenGL中的內容。但是,由於您應該將Assimp加載的數據複製到VBO中,無論是頂點數據還是元素數組,都可以在該步驟中進行任何必要的重新排列。

順便說一句:步幅表示元素開始之間的偏移量,而不是元素結束到下一個元素開始之間的偏移量。

0

最好的辦法是對網格進行三角網格劃分,以便與GL_TRIANGLES(或儘可能考慮交換材料/紋理等)一起繪製整個網格。

如果你真的想要不同大小的多邊形,這是可能的。我懷疑它會非常快,我認爲你不得不使用GL_TRIANGLE_FAN做三角測量,並不總是給出很好的結果(例如沿任一對角線分割一個四邊形)。無論如何,答案:

glPrimitiveRestartIndex可能會工作與glDrawElementsGL_TRIANGLE_FAN確定,但真正三角測量自己是最好的。 (其實很類似於你的「gl ... ElementPointer」的想法),但可能是slower than glPrimitiveRestartIndex

編輯另一種替代方案是glDrawElementsIndirect,但乍一看這可能比glPrimitiveRestartIndex花費更多。