2016-12-27 103 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