2017-03-17 19 views
0

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で各頂点とインデックスを印刷すると、正しく設定されているようです。

誰かが以前にその問題を抱えていたことがありますか、または正しい方向に私を指摘できますか?

必要に応じて、より多くのソースを共有できます。

ありがとうございます!

答えて

0

Welp!何が間違っているかを見つけ出した。それは私が投稿したスニペットのどれとも関係がありませんでした。治療的な方法で私の正気のために、私はその答えを詳細に説明します。

私のシェイダーでは、4x4マトリックスをバインドして、変換を適用して画面座標をマップします。簡単にするために、私はそれをポインタ配列に割り当て、これを2D変換のセットである別の3x3マトリックスからマップし、次に1の対角を0で、残りを0で塗りつぶします。

Welp、少なくともI 0を入力してください。私はシェーダにそれをウンチレンダリング中にパイプラインダウン

// GLfloat *renderMatrix 
renderMatrix = malloc(sizeof(GLfloat) * 4 * 4); // 4x4 matrix 

:ここで犯人だ

GLint matrixSlot = self.openGlContext->transformMatrixSlot; 
glUniformMatrix4fv(matrixSlot, 1, 0, renderMatrix); 

あなたはそれが何かを欠けている気づくかもしれません。はい、私はそれを使用する前にメモリを準備していません。

これですべての問題が修正され、グリッドが一貫して機能します。

レッスン:使用する前にメモリをゼロにしてください。

関連する問題