我正在创建一个粒子系统渲染器,问题是我的所有粒子位置都封装在一个类中,随着时间的推移将它们集成在一起并做其他一些事情。我没有将值复制到单独的数组中来渲染每个帧,而是创建了一个像这样的点结构,我可以用它来指向所有值一次:
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 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的任何信息。
答案 0 :(得分:0)
你正在做的是错误的,因为在C中,所有东西都是按值传递的,所以当你取消引用返回的struct的 .x 成员时,你就是在这个位置的副本上做的struct,如果未分配给任何值,将从堆栈弹出。
你的设计错了,你不需要像这样的结构:
typedef struct
{
float *x, *y, *z;
} point;
而是这样:
typedef struct
{
float x,y,z;
}
如果您仍想将其分配给它的原始值,那么如果原始结构的值发生更改,此结构也会更改,那么您需要一个将返回指向结构的指针的getter,并保持指针它:
points[i] = [[particles objectAtIndex:i] getPositionPointer];
这样你就可以确定你的struct包含原始结构的相同值,但是你违反了封装。这让我觉得也许你真的不需要持有指向原始结构的指针,但如果有理由这样做,那么我就给你指明了方向。