2010-07-18 90 views
1

我有一個結構稱爲Point(這恰好是一個Python擴展),看起來像這樣:OpenGL的頂點數組

struct Point { 
    PyObject_HEAD // Macro that expands to include a few more members 
    double x; 
    double y; 
}; 

而且我還有一個結構,將持有這些一堆兩個數組:

struct Polygon { 
    int length; 
    Point **vertex_points; 
    Point **texcrd_points; 
} 

我想要使用它們來映射具有頂點陣列的多邊形的頂點和紋理座標。問題是,頂點數組期待陣列格式爲:

[x, y, x, y, x, y, etc] 

有沒有一種方法,我可以打電話glVertexPointerglTexCoordPointerPolygon->vertex_pointsPolygon->texcrd_points,還是我來構建匹配的內容GL *指針期待新的陣列?

回答

2

你可以用頂點數組的底部調用glVertexPointer,用紋理座標數組的底部調用glTexCoordPointer。只要這些數組中的事物數量對齊到正確的(相同)數量的vert,這應該可以正常工作。

OpenGL無法顯式訪問結構的成員。成員將在彼此旁邊的記憶中放置(參見下面的警告)。如果多個Point結構在內存中是串聯的,那麼實際上你有一個大的雙打平坦表。 OpenGL不知道結構,它只是想要一個大的列表(在這個例子中是double)。但是你可以構建一系列的Point,並將OpenGL指向第一個指針,如果內存中的佈局沒有錯誤或填充,它們將是等效的。

如果你對C有太大的新感覺,那麼在調用GL之前,你應該把所有的雙精度數據複製到一個新的數組中。

我的確提出了一些問題:可能在這裏缺少代碼,但有Point**,而不是Point*看起來很腥,因爲glVertexPointer等將在這裏期望一個平面數組值。同樣的道理,雖然它可能已經很好地對齊了,理論上這些結構的數組可能不會在內存中齊刷刷包。您可以根據編譯器明確地執行此操作,也可以在GL調用中使用參數stride以明確每個垂直間的內存距離。

+0

問題是,glVertexPointer需要一個平面數組,而不是Points *。我需要一些方法告訴glVertexPointer座標數據在Point-> x和Point-> y中,而不必構建平面數組。 – 2010-07-18 00:35:27

+0

哦,並且多邊形具有Point **而不是Point * s是因爲Point是Python擴展類型。使用擴展類型的首選方式是始終操作它們的指針。 – 2010-07-18 00:37:28

+0

我用C內存管理信息更新了答案,我認爲這是理解上的差距。只有在您對自己的工作感到滿意的情況下才使用「內存多態」。我對Python不太瞭解,所以我會假設你知道你在做什麼。 :) – 2010-07-18 00:46:50