1

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。これが本来あるべき姿ですか?それによって増強されるのではなく、それに取って代わられる状態を表していますか? さらに、モードを からに変更して設定します。TRUEFALSEGL_VERTEX_ARRAYglBindVertexArrayGL_TRIANGLE_STRIPGL_POINTSglPointSize(5.0f)単一のポイントが 0, 0 に描画されるため、ポイントが作成されているように見えますが、頂点シェーダーによって適切に処理されていません。

4

1 に答える 1

4
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
};

オトグラフィー投影を使用しています (マトリックスがアイデンティティであるため)。基本的に、Z 値は無視できます。それらは問題ではありません。

これを三角形の帯として描くと、2 つの三角形になります。

最初の三角形は{(0.7f, 0.7f), (-0.7f, -0.7f), (-0.7f, -0.7f)}です。2 つの点が同じであるため、この三角形には目に見える表面積はありません。目に見える表面積のない三角形は見えません。

2 番目の三角形は{(-0.7f, -0.7f), (-0.7f, -0.7f), (0.7f, -0.7f)}です。前と同じように、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
};

それはあなたに何か役に立つものを手に入れる可能性が高くなります。それでも何も表示されない場合は、顔カリングをオフにします。

于 2012-03-17T21:30:47.193 に答える