OpenGLを使用しているアプリケーションの一部のコンテンツをレンダリングしようとしています。現在、私は長方形に単純な水平線と垂直線を描こうとしています。iOS OpenGL ESで間違った頂点がレンダリングされる
これはほとんどの場合、and this is how the proper render looksで動作します。
しかし時折、一見ランダムに、それは奇妙な形で画面の原点から始まる頂点描画します:私は自分自身をGLKViewを使用して、コンテキストを設定していThis is the same view controller, I just reopened it, and now it looks weirdly weird.
は、コンテキストの設定は次のようになります。
// [CustomView initWithFrame:] calls [OpenGLContext init]>
<OpenGLContext.m>
self.context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
[EAGLContext setCurrentContext:self.context];
<compile shaders, etc.>
<[CustomView initWithFrame:]>
self.context = self.openGlContext.context;
self.drawableDepthFormat = GLKViewDrawableDepthFormat24;
self.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888;
self.drawableStencilFormat = GLKViewDrawableStencilFormatNone;
self.drawableMultisample = GLKViewDrawableMultisample4X;
self.layer.opaque = YES;
self.opaque = NO;
すべてがうまくいき、その後VBOを生成します。ここに私の頂点オブジェクトは次のようになります。
typedef struct {
vector_float3 position;
packed_float4 color;
} VertexObject;
が頂点/インデックスデータを管理するために、私はそれをカプセル化するためにカスタムVertexArrayBuffer Objective-Cのクラスを使用してのmalloc/reallocのとポインタを使用します。私はレンダリングを開始する前に、私はこのようなVAO作成:glDrawElements
を呼び出す前に
- (void)createVAO:(VertexArrayBuffer*)vao // vao has the pointers and stuff
{
// Re-generate
glGenVertexArraysOES(1, &vao->vao);
glBindVertexArrayOES(vao->vao);
glGenBuffers(1, &vao->vertexBuffer); // VertexObject *vertexBuffer
glBindBuffer(GL_ARRAY_BUFFER, vao->vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, vao.vertexCount * sizeof(VertexObject), vao.vertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(positionSlot);
glVertexAttribPointer(positionSlot, 3, GL_FLOAT, GL_FALSE, sizeof(VertexObject), NULL);
glEnableVertexAttribArray(colorSlot);
glVertexAttribPointer(colorSlot, 4, GL_FLOAT, GL_FALSE, sizeof(VertexObject), (GLvoid*)sizeof(vector_float3));
glGenBuffers(1, &vao->indexBuffer); // GLuint *indexBuffer
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vao->indexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, vao.indexCount * sizeof(GLuint), vao.indices, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArrayOES(0);
}
を私はVBOsを更新:
- (void)updateVAO:(VertexArrayBuffer*)vao
{
glBindVertexArrayOES(vao->vao);
glBindBuffer(GL_ARRAY_BUFFER, vao->vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, vao.vertexCount * sizeof(VertexObject), vao.vertices, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vao->indexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, vao.indexCount * sizeof(GLuint), vao.indices, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArrayOES(0);
}
そして最後に、私はそれらを描く:
glDrawElements(GL_LINES, (GLsizei)vao.indexCount, GL_UNSIGNED_INT, NULL);
私が持っていますこれらのうち2つはビューコントローラで同時に実行され、グリッドエフェクトを必要とするガントビューごとに1つずつ表示されます。同時に1つだけ、またはその両方で不具合が発生することがあります。グリッドが表示されないことがあります。
私は自分のアラインメントをチェックし、同様の問題を抱えている人を検索しようとしましたが、他の人には何も起こりません。 po vao.vertices[0].position
で各頂点とインデックスを印刷すると、正しく設定されているようです。
誰かが以前にその問題を抱えていたことがありますか、または正しい方向に私を指摘できますか?
必要に応じて、より多くのソースを共有できます。
ありがとうございます!