2017-06-06 11 views
0

私はOpenGLにはかなり新しく、いくつかのオンラインチュートリアルを経てAPIに慣れてきました。OpenGL C++:VBOの構造ラッパーがメンバーを初期化しない

GLuint vboID;               
glGenBuffers(1, &vboID); 
glBindBuffer(GL_ARRAY_BUFFER, vboID); 
glBufferData(GL_ARRAY_BUFFER, sizeof(verticesArray), verticesArray, GL_STATIC DRAW); 

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 

そして、任意のVBOを宣言する前に、私はVAOを作成し、それをバインドします。私はVBOの作成は以下のような行くことを理解しています。この時点では、1つのVAOあたり1つのVBOを作成しています。

APIの上にいくつかのラッパーツールを作成したいので、VBOやVAOの作成などが便利になります。

私は構造体を作成し始めました。その構造体のコンストラクタでは、頂点の配列をとり、そこからVBOを作成します。私はこれを "triVBO"という名前にしました。なぜなら、今は "GL_TRIANGLES"オブジェクトしか作成していないからです。次のように

A "triVBO" 構造体が定義されている:

struct triVBO { 
GLuint ID = 0; 
const void* data = (void*)0; 
GLsizeiptr verticeCount = 0; 
GLsizeiptr triCount = 0; 

triVBO(const void* _data) { 
    //VBO generation 
    GLuint vboID; 
    glGenBuffers(1, &vboID); 
    glBindBuffer(GL_ARRAY_BUFFER, vboID); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(_data), _data, GL_STATIC_DRAW); 

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 

    //do our assigning 
    data = _data; 
    ID = vboID; 
    verticeCount = (sizeof(data)/sizeof(GLfloat))/3; 
    triCount = verticeCount/3; 
} 
}; 

すべてが実行され、罰金コンパイルします。しかし、問題は "verticeCount"と "triCount"メンバーの割り当てにあります。

コンストラクタからわかるように、このパラメータは "glBufferData()"の3番目のパラメータの型を確認したときに渡された配列であるため、私が使用した "const void *"私のコンストラクタに渡そうとしている配列には、const void *であることがわかりました。マクロと同じ型を使うべきだと考えました。

コンストラクタとメインプログラムで作成したDEBUGマクロをいくつか貼り付けましたが、これは読みやすいようにサンプルから削除しました。その中のDEBUGマクロを使ってプログラムを実行すると、これが得られます。

私はこれを呼び出す:コンソール版画この

triVBO tv_pyrVBO(pyramidVerts); 
DEBUG("pyramidVerts: ", pyramidVerts); 
DEBUG("tv_pyrVBO.data: ", tv_pyrVBO.data); 
DEBUG("tv_pyrVBO.ID: ", tv_pyrVBO.ID); 
DEBUG("tv_pyrVBO.verticeCount: ", tv_pyrVBO.verticeCount); 
DEBUG("tv_pyrVBO.triCount: ", tv_pyrVBO.triCount); 

を:私が言うことができるものから、

pyramidVerts: 00007FF603EFC4C0 
tv_pyrVBO.data: 00007FF603EFC4C0 
tv_pyrVBO.ID: 2 
tv_pyrVBO.verticeCount: 0 
tv_pyrVBO.triCount: 0 

、コンストラクタで、私がしようとしてきた、「データ」メンバーを、アドレスが同じであるため、配列「pyramidVerts」を割り当てることが適切に割り当てられています。また、 "ID"に2の値が正しく割り当てられているため、バッファの生成とバインドのコードが機能します(プログラム内に他のVBOが既に1つありません)。 "verticeCount"と "triCount"メンバーはコンストラクタで見ることができますが、両方とも値が0であるため正しく割り当てられていませんが、この特定の配列では18の値を持つ必要がありますそれぞれ6である。

エラーは何ですか?間違った型を使って配列を渡したり、 "verticeCount"と "triCount"の情報を保持していますか?私が紛失している、または間違って使用しているOpenGL APIに何かが割り当てられていませんか?私はC++やプログラミングの一般的なミスを明らかにしていますか?私は何時間も検索してきましたが、私の特定の質問に本当に答えるstackoverflowまたはquoraまたはcplusplusの回答を見つけることができませんでした。

何か助けや指示をいただければ幸いです。また、あなたが投げたい余分なGLチップも大歓迎です。ありがとう!

+0

[なぜOpenGLシェーダクラスを使用できますが、VAOクラスは使用できませんか?](https://stackoverflow.com/questions/32343272/why-can-i-have-an-opengl-shader- class-but-not-a-vao-class) – BDL

答えて

2

それは「verticeCount」とその計算あなたは、コンストラクタで見ることができる「triCount」のメンバーが、適切に

私はCのスーパー明白な間違いを犯して++またはプログラミングアム割り当てされていないことだけです一般?

はい。 sizeofはそのようには機能しません。入力のサイズを定義するもう1つのパラメータを取って代わりに使用するか、より良い方法として、std::vectorまたはそのサイズを知る標準のコンテナを使用します。

OpenGL APIをラッピングする前に、基本的なC++の概念を理解しておくことをおすすめします。これを行うには、使用する言語とAPIの知識が必要です。

+0

ありがとう!私は構造体の外側でそれを使用するときにはsizeofを使用することができますが、ラッパーを使用せずにバッファーを生成するだけです。私は標準からのベクトルを使ってみましたが、セットアップした他のコードではうまく動作しませんでした。私は何が起こるか見るためにサイズのparamを取ってみよう。アドバイスをいただき、ありがとうございます。私は、APIの学習と一緒に、私の基礎となるスキルを磨いていることを確認します。 – Davon

関連する問題