2017-01-13 5 views
0

私の頂点がオフスクリーンで描画されていた問題が発生しました。私はすべての私の頂点属性ポインターのためにストライドを0に変更しました、そして、彼らは正しい位置に描画します。ここで glVertexAttribPointerにストライドを適用すると、頂点の位置が正しく表示されない

はこれをオフに開始するためのいくつかのコードです:

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

glGenBuffers(1, &bufferID); 
glBindBuffer(GL_ARRAY_BUFFER, bufferID); 


GLfloat verts[4 * 2 * 3] = { -0.5, -0.5, 0.0, 1.0,// bottom left 
         .5, -.5, 0.0, 1.0, // bottom right 
         -.5, .5, 0.0, 1.0, // top left 
         0.5, 0.5, 0.0, 1.0, 
         .5, -.5, 0.0, 1.0, // bottom right 
         -.5, .5, 0.0, 1.0, // top left// top right 
         }; 
GLfloat color[4 * 3 * 2] = { 
    1.0f, 1.0f, 1.0f, 1.0f, 
    1.0f, 1.0f, 1.0f, 1.0f, 
    1.0f, 1.0f, 1.0f, 1.0f, 
    1.0f, 1.0f, 1.0f, 1.0f, 
    1.0f, 1.0f, 1.0f, 1.0f, 
    1.0f, 1.0f, 1.0f, 1.0f }; 

GLfloat tex[8] = { 
1.0f, 1.0f, 
1.0f, 0.0f, 
0.0f, 0.0f, 
0.0f, 1.0f 
}; 

glBufferData(GL_ARRAY_BUFFER, sizeof(verts) + sizeof(color) + sizeof(tex), nullptr, GL_STATIC_DRAW); 
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(verts), verts); 
glBufferSubData(GL_ARRAY_BUFFER, sizeof(verts), sizeof(color), color); 
glBufferSubData(GL_ARRAY_BUFFER, sizeof(verts) + sizeof(color), sizeof(tex), tex); 


glClearColor(0.05f, 0.05f, 0.05f, 1.0f); 







glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 10, NULL); 
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 10, (const GLvoid *)(sizeof(GLfloat) * 4)); 
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 10, (const GLvoid *)(sizeof(GLfloat) * 8)); 
glEnableVertexAttribArray(0); 
glEnableVertexAttribArray(1); 
glEnableVertexAttribArray(2); 


glGenBuffers(1, &ebo); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo); 

GLuint indices[4] = { 
    0,2,1,3 
}; 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_DYNAMIC_DRAW); 

をして、ここで私は混乱していますので、ここで

glClear(GL_COLOR_BUFFER_BIT); 

glBindTexture(GL_TEXTURE_2D, texture); 

glBindVertexArray(vertexID); 

glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_INT, 0); 
//glDrawArrays(GL_TRIANGLES, 0, 6); 
glFlush(); 

SDL_GL_SwapWindow(window); 

オーケーレンダリングコードです:

glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 10, NULL); 
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 10, (const GLvoid *)(sizeof(GLfloat) * 4)); 
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 10, (const GLvoid *)(sizeof(GLfloat) * 8)); 

にこのコードでは、プログラムはレンダリングしようとしている正方形をレンダリングしません。これらのすべてに対してストライドを0に変更すると、正しい位置にレンダリングされます。私はそれの私の理解は、私は3つの情報のセットをバッファリングした:位置、色、およびテックス座標。そのため、データは次のように見えた: enter image description here

私はsizeof(GLFloat)* 10にストライドを設定していますが、これは機能しません。これにより、オフセット値が正しく設定されていないと判断できます。 なぜ私のストライドが頂点の位置を乱すのですか?あなたはブロックであなたの頂点データをアップロード

答えて

2

そのため私は、データは以下のように見えたと思った:

しかし、それはあなたがOpenGLを言ったことはありません。

glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(verts), verts); 

これは、アレイvertsを取り、バッファオブジェクトの開始にそれをコピーするためにOpenGLを伝えます。

glBufferSubData(GL_ARRAY_BUFFER, sizeof(verts), sizeof(color), color); 

これは、アレイcolorを取るためにOpenGLを伝え、バッファオブジェクトにコピーしますが、vertsのすべての後に。

ここにはインターリーブはありません。ストアはすべてvertsのバッファに格納され、次にcolorのすべてが続き、その後にすべてtexが続きます。 vertsの4つのフロートと、colorの4つの浮動小数点と、それに続くtexの4つの浮動小数点が続きます。

glBufferSubDataは、データをインターリーブすることはできません(長時間の呼び出しでも可能ですが、面倒です)。インターリーブされた頂点データをアップロードする場合は、をCPUにインターリーブしてアップロードする必要があります。

ストライドを0に設定しても機能しません。さて、それは動作しません。実際にアップロードしたデータに比べて、ベースオフセットはまだ間違っています。正しい位置データが得られますが、色とテクスチャの座標は間違っています。

+0

はい私は何らかの理由でデータをインターリーブしていないsubBufferへの変更を認識していませんでした。だから今私は sizeof(verts) sizeof(verts)+ sizeof(color) ! – Luke

2

glBufferData(GL_ARRAY_BUFFER, sizeof(verts) + sizeof(color) + sizeof(tex), nullptr, GL_STATIC_DRAW); 
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(verts), verts); 
glBufferSubData(GL_ARRAY_BUFFER, sizeof(verts), sizeof(color), color); 
glBufferSubData(GL_ARRAY_BUFFER, sizeof(verts) + sizeof(color), sizeof(tex), tex); 

だから、のように終わる:

<vert 0, ... vert N><color 0, ..., color N><tex 0, ..., tex N> 

しかし、あなたのglVertexAttribPointer()の呼び出しは、バッファがこのようにインターリーブされたと主張されています

<vert 0><color 0><tex 0><vert 1><color1><tex 1>... 

アップロード時にデータをインターリーブするか、01を調整します。は、ブロックレイアウトを考慮して呼び出します。

関連する問題