有没有办法做到这一点?

时间:2010-07-13 00:57:26

标签: c++ c opengl vector

这是我的问题。我有一个std::vector<POINTFLOAT>存储顶点。问题是Vertex缓冲区对象接受指向float数组的指针。这就是我的问题所在。我不能给它一个pointfloat数组。有没有办法可以在不推送副本的情况下将指针推送到每个顶点的各个组件?

基本上不是:

vec[0].x
vec[0].y
vec[1].x
vec[1].y

变成

newvec[0]
newvec[1]
newvec[2]
newvec[3]

我想过制作一个std::vector<float*>,但我不认为opengl会喜欢这个。有没有办法在不复制数据的情况下执行此操作?

由于

我不想复制point.x,point.y的数据,而是希望OpenGL从原始向量中获取数据,所以基本上当openGL得到vec [0]时,它实际上会得到pointvec [0] .x但是它需要像通过引用传递时那样行事,没有尖头成员

所以Opengl不能做* vec [0]

2 个答案:

答案 0 :(得分:1)

你可以写这样的东西,即你有一个用顶点填充的std :: vector,然后你调用一个浮点数*的函数(例如一个openGL函数)。这就是你想要的吗?

void some_function(float* data)
{

}

...

std::vector<float> vec;
vec.push_back(1.2); // x1
vec.push_back(3.4); // y1
vec.push_back(5.6); // x2
vec.push_back(7.8); // y2

some_function(&vec[0]);

编辑:这也可以,因为浮动在内存中布局相同:

struct POINTFLOAT
{
    float x;
    float y;
};

void some_function(float* data)
{

}

...

std::vector<POINTFLOAT> vec;
vec.resize(2);
vec[0].x = 1.2; // x1
vec[0].y = 3.4; // y1
vec[1].x = 5.6; // x2
vec[1].y = 7.8; // y2

some_function((float*)(&vec[0]));

答案 1 :(得分:0)

我认为你的意思是std::vector<float>,而不是std::vector<float*>;指向浮点数的向量是不同的东西,虽然我并不熟悉OpenGL VBO,但我认为他们想要一个浮点数组,而不是一个指针数组。

唯一合适的解决方案是将std::vector<POINTFLOAT>更改为std::vector<float>。但是,这很明显,所以我假设你问的原因是你不想这样做。如果你想要一个hacky方法,你可以做:

std::vector<POINTFLOAT> v;
v.push_back(2.3);
v.push_back(3.4);
v.push_back(4.5);
v.push_back(5.6);
float* p = reinterpret_cast<float*>(&v[0]);

但这有点糟糕;除其他外,它依赖于POINTFLOAT类的内部布局(我假设它只是存储x和y坐标?)。 reinterpret_cast非常尖叫黑客,所以你真的应该改变矢量的类型,如果可能的话......