私は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チップも大歓迎です。ありがとう!
[なぜOpenGLシェーダクラスを使用できますが、VAOクラスは使用できませんか?](https://stackoverflow.com/questions/32343272/why-can-i-have-an-opengl-shader- class-but-not-a-vao-class) – BDL