2013-06-22 56 views
-1

我創建一個粒子系統的渲染器,問題是,我所有的粒子位置被封裝到集成它們隨着時間的推移,並做一些其他的東西類。相反的值複製到一個單獨的陣列以使各幀的,我創建的點結構這樣,我可以使用到指向所有值一次:傳遞浮動指針數組VBO

typedef struct 
{ 
    float *x, *y, *z; 
} point; 

然後我MALLOC這些相同的尺寸的陣列作爲我的一系列粒子。

宣言在頂部:

point *points; 

malloc的:

points = malloc(sizeof(point) * [particles count]); 

我然後循環通過所有的顆粒,並且每個位置的地址複製到對應的指針,以便:

for (int i = 0; i < [particles count]; ++i) 
{ 
    points[i].x = &[[particles objectAtIndex:i] getPosition].x; 
    points[i].y = &[[particles objectAtIndex:i] getPosition].y; 
    points[i].z = &[[particles objectAtIndex:i] getPosition].z; 
} 

我的get位置函數只返回一個向量struct(float x,y,z)。

我與此遇到的第一個問題是,當我顯示像這樣的值:

NSLog(@"%f", *points[0].x); 

相反的值(比如:0.5)的讀數,它顯示它倒圓和否定(以便: - 1.0)。

然後我得到的數據爲我的VBO是這樣的:

glBufferData(GL_ARRAY_BUFFER, sizeof(point) * [particles count], &points[0], GL_DYNAMIC_DRAW); 

我想這也是錯誤的,但無法找到如何指針傳遞到維也納組織的任何信息。

回答

0

你在做什麼是錯誤的,因爲在C中,所有東西都是按值傳遞的,所以當你解引用.x成員返回的結構體時,你是在位置結構體的副本上做的,如果未分配給任何值,則從堆棧彈出。

你的設計是錯誤的,你不需要像這樣的一個結構:

typedef struct 
{ 
    float *x, *y, *z; 
} point; 

而是一個這樣的:

typedef struct 
{ 
    float x,y,z; 
} 

如果你還是想給它分配給它原始值,以這種方式,如果原始結構的值發生變化,同樣這個結構被改變,那麼你需要一個getter,它將返回一個指向結構的指針,並且持有一個指向它的指針:

points[i] = [[particles objectAtIndex:i] getPositionPointer]; 

通過這種方式,您可以確定您的結構包含原始結構的相同值,但是您違反了封裝。這讓我想,也許你不需要持有一個指向原始結構的指針,但是如果有理由做,那麼我已經向你展示了方式。

+0

的爲getPosition返回值的結構不是指針,我一直在它的類中的每個粒子的位置。 – user22817

+0

好吧,我編輯了這個答案。一定要了解如何通過價值傳遞在C中工作,這是一個重要的事實。 –

+0

那麼,當我創建一個簡單的獨立指針指向類值時,如果我改變了類的值,它是否也會改變? – user22817