Есть ли способ сделать это? - PullRequest
0 голосов
/ 13 июля 2010

Вот моя проблема. У меня есть std::vector<POINTFLOAT>, который хранит вершины. Проблема в том, что буферные объекты Vertex получают указатель на массив с плавающей точкой. В этом и заключается моя проблема. Я не могу дать ему массив 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 ]

1 голос
/ 13 июля 2010

Вы можете написать что-то вроде этого, то есть у вас есть std :: vector, который вы заполняете вершинами, а затем вы вызываете функцию (например, функцию openGL), которая принимает float *.Это то, что вы хотите?

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]));
0 голосов
/ 13 июля 2010

Я думаю, что вы имеете в виду std::vector<float>, а не std::vector<float*>; вектор указателей на float - это нечто иное, и хотя я не очень хорошо знаком с OpenGL VBO, я предполагаю, что им нужен массив float, а не массив указателей.

Единственное правильное решение - изменить std::vector<POINTFLOAT> на std::vector<float>. Тем не менее, это отчасти очевидно, поэтому я предполагаю, что причина, по которой вы спросили, заключается в том, что вы не хотите этого делать. Если бы вы хотели обойти это, вы могли бы сделать:

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 довольно много криков, так что вам действительно следует изменить тип вектора, если это вообще возможно ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...