[解決済み] glGenVertexArraysとglGenBuffersの引数
質問
OpenGL 3.0+のチュートリアルでは、この方法でVertex Array ObjectとVertex Buffer Objectを作成します。
GLuint VAO, VBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
ここで、VAOは
unsigned int
(
GLuint
) にそのアドレスを渡し、関数
glGenVertexArray
. しかし、ドキュメントによると、この関数の第2引数には
の配列
unsigned int
(
GLuint*
). 同じくVBOと
glGenBuffers
. なぜ、このような引数で上記のコードが動作するのか理解できません。
私は上記のコードをこのコードで置き換えることを試みました(そして、私のコードの他の場所で必要な修正を行います)。
GLuint VAO[1];
GLuint VBO[1];
glGenVertexArrays(1, VAO);
glGenBuffers(1, VBO);
glBindVertexArray(VAO[1]);
glBindBuffer(GL_ARRAY_BUFFER, VBO[1]);
最初の構文ではテクスチャ付きの矩形がレンダリングされますが、2番目の構文ではされません。なぜこのようなことが起こるのか理解できません。
EDIT : ありがとうございます。記載されているように、2番目のコードにインデックス付けのミスがあります。
解決方法は?
スペック上の関数シグネチャは
void glGenVertexArrays( GLsizei n, GLuint *arrays);
だから
arrays
は
GLuint
ポインタ
と書くのが妥当なところ
n * sizeof(GLuint)
バイトのデータを送信します。
書いても全く問題なく、有効です。
GLuint VAO, VBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
なぜなら
glGenVertexArrays
へのポインタを持ちたい。
GLuint
を記述することが有効です。
n * sizeof(GLuint)
バイトのデータ(あなたの場合
1
) であり、かつ
VAO
がこれだけのデータを保持できるのだから、そのように書くのが正しい。また、1回の呼び出しで1つのidしか作らないのであれば、andが望ましい。
すでに他の人が言っているように、配列の最初の要素はインデックスが
0
. ということでなければならない。
GLuint VAO[1];
GLuint VBO[1];
glGenVertexArrays(1, VAO);
glGenBuffers(1, VBO);
glBindVertexArray(VAO[0]);
glBindBuffer(GL_ARRAY_BUFFER, VBO[0]);
一度の呼び出しでより多くの要素を作成したい場合は
std::array
オーバー
[]
.
std::array<GLuint,3> VAOs;
std::array<GLuint,3> VBOs;
glGenVertexArrays(VAOs.size(), &VAOs[0]);
glGenBuffers(VBOs.size(), &VBOs[0]);
ノートとして
unsigned int
と
GLuint
は、必ずしも同じ種類や大きさである必要はありません。
unsigned int
には最低保証数の範囲がありますが、それでもプラットフォームが異なればサイズは異なる可能性があります。
GLuint
一方、サイズは定義されています。
関連
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み] テスト
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件