2016-08-01 2 views
0

私は、OpenGLES 2.0について学ぶために簡単なiOSアプリケーションを開発しています。このプロジェクトでは、ピラミッドの頂点の高さを調整するためのスライダーとy軸の周りのmodalViewMatrixを回転させるために、4つの三角形をピラミッドの形でレンダリングしています。このオブジェクトを反時計回りに三角形が他の三角形の前に現れる点まで回転させた後、私は三角形の近くを見ることができる理由を見つけようとしています。しかし、時計回りに同じ点に回転すると、近くの三角形は不透明で最も遠い三角形を塞いでしまいます。GLKitで三角形を見る

私は理由が深さレンダリングバッファが不足していると仮定しましたが、プロパティーを設定した後には、view.drawableDepthFormat = GLKViewDrawableDepthFormat16;の動作は持続します。

参考のために、これは私のdrawRect関数で描画が行われます。他のコードはviewDidLoadとxcodeプロジェクトのグローバルスコープでのみ実行されます。

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect { 

    [self.baseEffect prepareToDraw]; 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 


    glBindBuffer(GL_ARRAY_BUFFER,pos); 



    glEnableVertexAttribArray(GLKVertexAttribPosition); 

    const GLvoid * off1 = NULL + offsetof(SceneVertex, position) ; 

    glVertexAttribPointer(GLKVertexAttribPosition,    // Identifies the attribute to use 
         3,    // number of coordinates for attribute 
         GL_FLOAT,   // data is floating point 
         GL_FALSE,   // no fixed point scaling 
         sizeof(SceneVertex),   // total num bytes stored per vertex 
         off1); 






    glEnableVertexAttribArray(GLKVertexAttribNormal); 


    const GLvoid * off2 = NULL + offsetof(SceneVertex, normal) ; 

    glVertexAttribPointer(GLKVertexAttribNormal,    // Identifies the attribute to use 
         3,    // number of coordinates for attribute 
         GL_FLOAT,   // data is floating point 
         GL_FALSE,   // no fixed point scaling 
         sizeof(SceneVertex),   // total num bytes stored per vertex 
         off2); 


    GLenum error = glGetError(); 
    if(GL_NO_ERROR != error) 
    { 
     NSLog(@"GL Error: 0x%x", error); 
    } 


    int sizeOfTries = sizeof(triangles); 
    int sizeOfSceneVertex = sizeof(SceneVertex); 

    int numArraysToDraw = sizeOfTries/sizeOfSceneVertex; 

    glDrawArrays(GL_TRIANGLES, 0, numArraysToDraw); 

} 
+0

深度テストと深度書き込みを有効にして、深度テストをどこに設定していますか?また、裏面のカリングを無効にして、それが違いを生むかどうかを確認することもできます(glDisable(GL_CULL_FACE)) – Columbo

+0

奥行きバッファに関する唯一の行はdrawableDepthFormatプロパティの設定です。 GLKViewにも設定できるブール値はどこですか? –

答えて

0

デプスバッファを持つだけでは不十分です。OpenGLにどのように使いたいかを伝える必要があります。次の行を追加してみてください:私たちはここにいる間、私はほとんどのユースケース(より良い精度)のためGLKViewDrawableDepthFormat16上GLKViewDrawableDepthFormat24をお勧めします

glEnable(GL_DEPTH_TEST); // Enable depth testing 
glDepthMask(GL_TRUE);  // Enable depth write 
glDepthFunc(GL_LEQUAL); // Choose the depth comparison function 

xcodeのフレームキャプチャ機能(doc)に慣れておくことをお勧めします。レンダリングが意図した通りに動作していないときに何が起こっているのかを把握することは本当に貴重な方法です。

+1

'GL_TRUE'は深度マスクのデフォルトであり、' GL_LESS'(少なくとも 'GL_LEQUAL'と同様に動作します)は比較関数のデフォルトです。したがって、最初の行だけが必要です。 –

+0

私はこれらの行を追加しましたが、まだ近くの三角形を見ることができます。おそらく照明と関係がありますか?点灯した部分は完全に不透明ではありませんか? –

+0

glDisable(GL_BLEND)とglDisable(GL_CULL_FACE)を追加して、それが役立つかどうか確認してください。 – Columbo