2015-10-02 34 views
1

在我的類似CAD的應用I存儲在以下結構中的陣列矢量座標:具有不同結構的大陣列的快速轉換

struct coord 
{ 
    double  x,y,z; 
    unsigned char flags; 
}; 

的x,y和z保持的3D座標,標記包含附加信息(例如如果一個多邊形在這裏結束並且不需要繪製到這個數組中的下一個座標)。

現在這些數據必須被轉換爲一個浮點數組,每個浮點數對應於x,y和z,並且這些三元組的數量與要繪製的多邊形中的點數一樣多。原因是:轉換後的座標數組必須交給OpenGL函數glVertexAttribPointer()讓OpenGL繪製該多邊形。

我的問題:轉換這些數據的最快方式是什麼?我唯一的想法是分配目標數組,並在循環中通過它來將座標值向下浮動 - 這對我來說聽起來相當緩慢。

還有其他想法嗎?

謝謝! *)

*)我知道stackoverflow不喜歡友好,但事實上我喜歡它是友好的,這就是爲什麼我要感謝所有試圖在這裏給出答案的人!在這個世界上有足夠的不友好的地方,stackoverflow不應該是另一個!

+0

編寫一個包裝類,它已經將一個數組/矢量中的座標x,y,z保存在一個包含相同長度的'flags'的單獨對應數組中。只需將內部數組(或vector.data())交給OpenGL函數(而不是複製大量數據),就像'string :: c_str()'。 –

+0

@PeterSchneider不,這不合法。請參見[什麼是嚴格的別名規則?](http:// stackoverflow。com/questions/98650/what-is-strict-aliasing-rule) – NathanOliver

回答

1

好吧,如果你能在第一時間使用float代替double應付,你可以保持您的座標這款平板陣列在首位:

struct coord { float x,y,x; }; 
struct point { coord *c; // pointer into global array of coord 
       unsigned char flags; }; 

這會導致問題,如果你需要刪除或者重新排序點數 - 您需要反向查找來重寫每個受影響點的指針coord

它還引入了額外的間接尋址,因此可能會加速渲染而犧牲其他操作。

最後,完全有可能float對於您的主要用途來說確實不夠精確,在這種情況下,您必須在某個時刻執行double->float轉換。在GL調用之前避免執行它的唯一方法是始終更新每個座標的兩個版本(或保留GL座標需要重寫的髒點列表的混合方法)。


NB。我忘了提及 - 如果您想使用它,您可能需要明確標記該結構爲已壓縮,具體取決於您的填充和對齊規則。不過,您始終可以存儲一個平面數組float並指向第一個(x)元素。

+0

浮動而不是雙倍的原因是什麼? –

+0

OP將float指定爲所需目標類型的事實。 – Useless

+0

哦,我錯過了!這改變了很多問題。 –