2013-06-22 38 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