2016-12-27 23 views
0

シンプルなOBJパーサーを実装し、サンプルモデルとして平行六面体を使用しました。クォータニオンに基づいてローテーション機能を追加しました。次のゴール - ライトを追加する。私は法線を解析し、法線を「デバッグ」機能(光をより深く理解するため)として決定しました。しかし、私はその後立ち往生:Open GL ES 2.0複数の描画要素と描画命令

enter image description here

をここに私の直方体を小さな回転と。 右下の頂点と正常を見てください。私はそれがなぜ私の平行六面体を通してレンダリングされるのか理解できません。それは隠されるべきです。

私はデプスバッファーを使用しています(それを回転させている間、それは奇妙に見えるので、平行六面体ではありません)。

glGenRenderbuffers(1, &_depthRenderbuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, _depthRenderbuffer); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, _frameBufferWidth, _frameBufferHeight); 

を、それを有効にする:私はそれを初期化するI 4 VBOs生成

glEnable(GL_DEPTH_TEST); 

:線(法線)のための平行六面体、頂点インデックスバッファの頂点およびインデックスバッファ。 両方のモデルに1つのシンプルなシェーダを使用します(必要な場合は、後でコードを追加できますが、すべてが問題ないと思います)。 最初は、平行四辺形を描く。 ここに私のコード:

// _field variable - parallelepiped 

glClearColor(0.3, 0.3, 0.4, 1.0); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

int vertexSize = Vertex::size(); 
int colorSize = Color::size(); 
int normalSize = Normal::size(); 
int totalSize = vertexSize + colorSize + normalSize; 
GLvoid *offset = (GLvoid *)(sizeof(Vertex)); 

glBindBuffer(GL_ARRAY_BUFFER, _geomBufferID); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indicesBufferID); 

glVertexAttribPointer(_shaderAtributePosition, vertexSize, GL_FLOAT, GL_FALSE, sizeof(Vertex::oneElement()) * totalSize, 0); 
glVertexAttribPointer(_shaderAttributeColor, colorSize, GL_FLOAT, GL_FALSE, sizeof(Color::oneElement()) * totalSize, offset); 

glDrawElements(GL_TRIANGLES, _field->getIndicesCount(), GL_UNSIGNED_SHORT, 0); 

#ifdef NORMALS_DEBUG_DRAWING 
    glBindBuffer(GL_ARRAY_BUFFER, _normalGeomBufferID); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _normalIndexBufferID); 

    totalSize = vertexSize + colorSize; 
    glVertexAttribPointer(_shaderAtributePosition, vertexSize, GL_FLOAT, GL_FALSE, sizeof(Vertex::oneElement()) * totalSize, 0); 
    glVertexAttribPointer(_shaderAttributeColor, colorSize, GL_FLOAT, GL_FALSE, sizeof(Color::oneElement()) * totalSize, offset); 
    glDrawElements(GL_LINES, 2 * _field->getVertexCount(), GL_UNSIGNED_SHORT, 0); 
#endif 

私は1で、この2つのドローコールをマージ(そして、直方体や法線に対して同じVBOsを使用する - すべてが正常になります)かどうかは、たとえば理解しています。 私は線と三角形を使うので不快になります。

Zオーダーを修正する別の方法があるはずです。複雑なシーン(空、土地、建物など)が1回のドローコールで描画されるとは思えません。

私は何が足りないのですか?

ありがとうございます。

答えて

1

ウィンドウ・サーフェスにレンダリングする場合、EGL構成要求の一部として深さを要求する必要があります。割り当てた深さのレンダーバッファは、オフスクリーンレンダリングのためにフレームバッファオブジェクト(FBO)に接続する場合にのみ便利です。

+0

ありがとうございます!私はtotalyこのラインを忘れました glFramebufferRenderbuffer(GL_FRAMEBUFFER、GL_DEPTH_ATTACHMENT、GL_RENDERBUFFER、_depthRenderbuffer); これは期待どおりに動作します。 あなたは私の一日を作った:) – frankWhite

関連する問題