2016-12-27 107 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); 

和啓用:

glEnable(GL_DEPTH_TEST); 

我生成4維也納組織:頂點和索引緩衝器爲平行六面體,頂點和索引緩衝器爲線(法線)。 我對這兩種模型都使用了一個簡單的着色器(如果需要的話 - 我可以稍後添加代碼,但我認爲一切都可以)。 起初,我繪製了平行六面體,之後 - 法線。 這裏我的代碼:

// _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 

我理解,例如,如果我在合併這一個兩隊戰平電話(和使用平行六面法線相同維也納組織 - 一切都會好起來)。 但是因爲我使用線條和三角形,所以會很不舒服。

應該有另一種固定Z順序的方法。我無法相信複雜的場景(例如天空,土地和建築物)會通過一個平局呼叫。

那麼,我錯過了什麼?

在此先感謝。

回答

1

如果您正在渲染窗口表面,則需要請求深度作爲EGL配置請求的一部分。如果您將其分配給Framebuffer對象(FBO)以進行離屏渲染,則您已分配的深度渲染緩衝區纔有用。

+0

非常感謝!我總是忘了這行 glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,GL_RENDERBUFFER,_depthRenderbuffer); 現在它按預期工作。 你讓我的一天:) – frankWhite