-1

我正在创建一个粒子系统渲染器,问题是我所有的粒子位置都被封装到类中,这些类会随着时间的推移将它们整合起来并做一些其他的事情。我没有将值复制到单独的数组中来渲染每一帧,而是创建了一个像这样的点结构,我可以用它来指向所有值一次:

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

然后我 malloc 一个与我的粒子数组大小相同的数组。

顶部声明:

point *points;

马洛克:

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 position 函数只返回一个向量结构 (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);

我认为这也是错误的,但找不到有关如何将指针传递到 VBO 的任何信息。

4

1 回答 1

0

您所做的是错误的,因为在 C 中,所有内容都是按值传递的,因此当您取消引用返回结构的.x成员时,您是在位置结构的副本上执行此操作,如果该结构将从堆栈中弹出未分配任何值。

你的设计是错误的,你不需要这样的结构:

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

而是这样的:

typedef struct
{
    float x,y,z;
}

如果你仍然想将它分配给它的原始值,如果原始结构的值发生变化,这个结构也会改变,那么你需要一个 getter 来返回一个指向该结构的指针,并持有一个指向它的指针:

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

这样,您可以确定您的结构包含与原始结构相同的值,但是您违反了封装。这让我觉得也许你真的不需要持有指向原始结构的指针,但如果有理由这样做,那么我已经向你展示了方法。

于 2013-06-22T11:54:13.367 回答