OpenGL VAO/VBO のハンドルを取得しようとしていますが、概念的にはそこにいますが、何らかの理由で、このアプリケーションは画面に何も描画していません。私は 4.2 のコンテキストで作業していますが、コアのみの 3.3 について書いています。
関連する変数の宣言は次のとおりです。
// Tetrahedron vertices
GLfloat tetra_vertices[12];
GLuint tetra_vao;
GLuint tetra_vbo;
と呼ばれる関数init_scene
には、次のものがあります。
glGenVertexArrays(1, &tetra_vao);
glBindVertexArray(tetra_vao);
glGenBuffers(1, &tetra_vbo); // One for vertex locations
glBindBuffer(GL_ARRAY_BUFFER, tetra_vbo); // Bind vertex locations buffer
glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), tetra_vertices, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);
そして私のGLSLプログラムがリンクされている場所:
for (int i = 0; i < num_shaders; ++i)
glAttachShader(program, shaders[i]);
glBindAttribLocation(program, 0, "in_position");
glLinkProgram(program);
使用する属性は 1 つだけです。それが頂点の位置です。プログラムはエラーなしでリンクします。
draw_scene
関数自体は次のとおりです。
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindVertexArray(tetra_vao);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 12);
glBindVertexArray(0);
そして、良い尺度として、私の頂点シェーダーは次のとおりです。
#version 330
in vec3 in_position;
uniform mat4 modelview_matrix;
void main(void) {
gl_Position = vec4(in_position, 1.0f) * modelview_matrix;
}
modelview_matrix
は、当面は恒等行列を渡すだけのユニフォームです。単純に見えない何かが描かれているのではないかと一瞬思ったので、クリア カラーをグレーに設定しました。これが、白を出力するフラグメント シェーダーです。
#version 330
out vec4 vFragColor;
void main(void)
{
vFragColor = vec4(1.0f);
}
私が読んだすべてのもの、特にこのチュートリアルと Superbible は、一連の出来事を非常に明確にしています。
- VAO を作成する
- VAO をバインドする
- VBO を作成する
- VBO をバインドして埋める
- 属性ポインタを設定する
glDEBugger を使用して、これが機能しない理由をより明確に把握しようとしました。私は GL エラー セットでブレークを設定しているので、GL 関数自体によってエラーが発生していないことがわかっています。VBO の内容を見ることができます。これは期待される頂点データです。私が確信していない唯一のことは、VBO が頂点位置データとして VAO に関連付けられていること、および描画関数を呼び出すときに VAO が実際に正しくバインドされていることを確認する方法です。
必要なもので省略したものがあれば、お知らせください。ありがとう!
更新 1:
以下は、VBO にロードされた頂点データを提供する配列です。
tetra_vertices = {
0.7f, 0.7f, 0.7f,
-0.7f, -0.7f, 0.7f,
-0.7f, -0.7f, -0.7f,
0.7f, -0.7f, 0.7f
};
私のすべてのコンテキスト設定は次のようになります。
glClearColor(0.2,0.2,0.2,0.0);
glClearDepth(1.0);
glViewport(0, 0, properties.size_x, properties.size_y);
glEnable(GL_DEPTH_TEST);
glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);
glEnable(GL_VERTEX_ARRAY);
glEnable(GL_MULTISAMPLE);
更新 2:
以下のニコル・ボーラスの回答は、私が考えていなかった正投影の可視性についての良い点をもたらしました。残念ながら、それが問題ではないようです。私は彼の頂点リストを試し、カリングをオフにして、これらの頂点を試しました。
tetra_vertices = {
-0.7f, -0.7f, 0.0f,
-0.7f, 0.7f, 0.0f,
0.7f, -0.7f, 0.0f,
0.7f, 0.7f, 0.0f
};
どちらが正方形を描くべきだと思いますが、それでも何もありません。glDrawArrays
また、4 つの要素 (12 の座標 = 4 つの x、y、z 頂点) である必要があるときに 12 の要素で呼び出していることにも気付きましたが、これでも問題は解決しませんでした。
更新 3 (または「投稿が長すぎる場合」):
gDEBugger でアプリケーションを順を追って見ていくと、奇妙な点に気付きました。このdraw
関数には、現在の VAO をバインドし、 を呼び出しglDrawArrays
、VAO 0 をバインドして、別のものを描画できるようにするという通常のサイクルがあります。これが発生したときに GL 状態設定を監視すると、VAO がバインドされていない (つまり、VAO 0 がバインドされている)ときと、VAO がバインドされているときのように見えますGL_VERTEX_ARRAY
。これが本来あるべき姿ですか?それによって増強されるのではなく、それに取って代わられる状態を表していますか? さらに、モードを からに変更して設定します。TRUE
FALSE
GL_VERTEX_ARRAY
glBindVertexArray
GL_TRIANGLE_STRIP
GL_POINTS
glPointSize(5.0f)
単一のポイントが 0, 0 に描画されるため、ポイントが作成されているように見えますが、頂点シェーダーによって適切に処理されていません。