0

2 つの異なるオブジェクトがあり、それらを 1 つのシーン内でレンダリングしたいと考えています。

最初のオブジェクトを初期化するときに、このコードを呼び出します。

float f[] = {
              -0.1f, 0.1f, 0.1f,  
               0.1f, 0.1f, 0.1f,
               0.1f,-0.1f, 0.1f,
              -0.1f,-0.1f, 0.1f,
              -0.1f, 0.1f,-0.1f,
               0.1f, 0.1f,-0.1f,
               0.1f,-0.1f,-0.1f,
              -0.1f,-0.1f,-0.1f

              }; 

  float c[] = {
              1.0f, 0.0f, 0.0f,  
              0.0f, 1.0f, 0.0f,
              0.0f, 0.0f, 1.0f,
              1.0f, 0.0f, 0.0f,  
              0.0f, 1.0f, 0.0f,
              0.0f, 0.0f, 1.0f,
              1.0f, 0.0f, 0.0f,  
              1.0f, 0.0f, 0.0f,  
  };

  unsigned int indarr[] = {2,3,6,7,4,3,0,2,1,6,5,4,1,0};

  glGenBuffers(2, vbo); 
  pos = vbo[0]; // Der Buffer für die Position
  col = vbo[1]; // Der BUffer für die Farbe

  glBindBuffer(GL_ARRAY_BUFFER, pos);
  glBufferData(GL_ARRAY_BUFFER, sizeof(f),f,GL_STATIC_DRAW); // Befüllen

  glBindBuffer(GL_ARRAY_BUFFER, col);
  glBufferData(GL_ARRAY_BUFFER, sizeof(c),c,GL_STATIC_DRAW); // Befüllen


  glGenVertexArrays(1, &vao);
  glBindVertexArray(vao);

  glEnableVertexAttribArray(0);
  glEnableVertexAttribArray(1);

  glBindBuffer(GL_ARRAY_BUFFER, pos);
  glVertexAttribPointer(0, 3, GL_FLOAT,GL_FALSE, 3*sizeof(float),0);
  glBindBuffer(GL_ARRAY_BUFFER, col);
  glVertexAttribPointer(1, 3, GL_FLOAT,GL_FALSE, 3*sizeof(float),0);

  glGenBuffers(1, &ind);
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ind);
  glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indarr),indarr,GL_STATIC_DRAW);

render 関数内のコードは次のとおりです。

  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ind);
  glBindVertexArray( vao );
  glDrawElements(GL_TRIANGLE_STRIP, 14, GL_UNSIGNED_INT, 0);
  glBindBuffer(GL_ARRAY_BUFFER, 0);
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

シーン内でこのオブジェクトをレンダリングすると、すべて正常に動作します。別のオブジェクトを作成しようとしたときに問題が発生しました。コードは上記のサンプルのように見えますが、唯一の違いは、f、c、および intarr 配列を変更したことです。オブジェクトが異なって見えるはずだからです。2 番目のオブジェクトでは、それほど多くの頂点は必要ないので、indarr[] を変更しました (短くしました)。問題は、最初のオブジェクトがその変更の影響を受けているように見えることです。

シーンは次のようになります

obj1->render();
obj2->render();

誰かが私を助けて、何が起こるか教えてもらえますか? 特に、なぜそれらが互いに影響し合っているのですか?

編集:

うーん、私は最終的にエラーを修正しました、

古いレンダリング関数は次のようになります。

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ind);
glBindVertexArray( vao );
glDrawElements(GL_TRIANGLE_STRIP, 14, GL_UNSIGNED_INT, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

私はこれを次のように変更しました:

glBindVertexArray( vao );
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ind);
glDrawElements(GL_TRIANGLE_STRIP, 14, GL_UNSIGNED_INT, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

そして今、それは機能します。エラーが発生した理由はまだわかりません。多分誰かが今それを説明できますか?

4

1 に答える 1

-1

vbo はどこで宣言していますか? pos と col を vbo[0] と vbo[1] に設定しているように見えるので、これらはメンバー変数ですが、vbo の宣言が表示されません。

現実的には、直接「間違っている」ものは何もないため、ここで決定を下すにはさらに多くのコードを確認する必要があります。

入れてみる

glFlush();
glBindVertexArray(0);

オブジェクト初期化コードの最後に。

以来

unsigned int indarr[]

Edit と f[] と c[] も

スコープ外に出ると、システムはそのメモリを解放します。ただし、OpenGL はそれまでにデータを完全にバッファリングしていない可能性があります。次のオブジェクトは、openGL が読み取る前にそのメモリを上書きする可能性があります。

glFlush();

opengl が終了するまでコードを待機させます。試してみる価値。

于 2013-03-28T23:54:17.970 に答える