OpenGL:std :: vectorでVBOを使う

私はオブジェクトを読み込み、VBOとglDrawArrays()を使ってレンダリングしようとしています。問題は、このポインタが格納できる値の制限を超えたため、 float f [] = {...} のような単純な浮動小数点ポインタが私のケースでは機能しないことです。だから、私のソリューションはベクターを使うことでした。そして、それは動作していません...

ここに私のコードです:

unsigned int vbo;
vector vert;

...
vert.push_back(new float(i*size));
vert.push_back(new float(height*h));
vert.push_back(new float(j*size));
...

glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vert), &vert, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

レンダリングする:

glBindBuffer(GL_ARRAY_BUFFER, vbo);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, 0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
glDisableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);

I'm having problem on the glBufferData() where the 3rd parameter is const GLvoid *data. I'm passing &vert but It's not working.

2
nl ru de

2 答え

あなたはしたい:

unsigned int vbo;
vector vert;

...
vert.push_back(i*size);
vert.push_back(height*h);
vert.push_back(j*size);
...

glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, vert.size() * sizeof(float), vert.data(), GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

ドキュメントを読むことは常に有効です。また、良いC ++の本を手に入れることをお勧めします。これはおそらく、あなたがこれらのような間違いを避けるための良い方法になるでしょう。

13
追加された
移植性を高めるには、sizeパラメータに vert.size()* sizeof(float)を使用する方がよいでしょう。
追加された 著者 Kevin,
@ Kevin実際にはvert.size()を使用しても全く動作しません。 VBOの1/4だけがレンダリングされます
追加された 著者 KaareZ,
どうもありがとうございました。
追加された 著者 Tiago Salzmann,

C ++ 11または vert.data がコンパイルされないかどうかを確認してください。

std :: vector ドキュメントを見ると、 std :: vector :: data()はC ++ 11でタグ付けされます。

http://www.cplusplus.com/reference/vector/vector/data/

C ++ 11をお持ちでない場合は、次のことができます:

unsigned int vbo;
vector vert;

...
vert.push_back(i*size);
vert.push_back(height*h);
vert.push_back(j*size);
...

glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, vert.size(), &vert[0], GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

ベクトルの最初の要素への参照を取得すると、データ自体へのポインタが得られます。

4
追加された
&vert [0] を試しましたか?どのコンパイラを使用していますか? C ++ 11の前に私のコードはすべてこのフォームを使い、うまく動作します。
追加された 著者 McLeary,
私はすでにそれを試みたが、うまくいかなかった。しかし、私はC ++ 11を持っていたので、 data は解決策でした
追加された 著者 Tiago Salzmann,
ああ、私は解決策を見つけた。これを行う正しい方法は、 vert.data()または&(vert [0])です。 &vert [0] が私にとってうまくいかなかった
追加された 著者 Tiago Salzmann,