将浮点指针数组传递给VBO

时间:2013-06-22 05:50:47

标签: objective-c c arrays pointers opengl-es-2.0

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

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的任何信息。

1 个答案:

答案 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包含原始结构的相同值,但是你违反了封装。这让我觉得也许你真的不需要持有指向原始结构的指针,但如果有理由这样做,那么我就给你指明了方向。