我实现了简单的OBJ分析器并使用平行六面体作为示例模型。我添加了基于四元数的旋转特征。下一个目标 - 增加光线。我解析了法线并决定将法线绘制为“调试”特征(为了更好地理解光线)。但我以后坚持:Open GL ES 2.0多重绘制元素和绘制顺序
这里我长方体小的旋转。 看看右边更深的顶点和正常。我不明白为什么它通过我的平行六面体呈现。它应该被隐藏。
我使用深度缓冲区(因为没有它,平行六面体看起来奇怪,而我旋转它)。因此,我初始化:
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顺序的方法。我无法相信复杂的场景(例如天空,土地和建筑物)会通过一个平局呼叫。
那么,我错过了什么?
在此先感谢。
非常感谢!我总是忘了这行 glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,GL_RENDERBUFFER,_depthRenderbuffer); 现在它按预期工作。 你让我的一天:) – frankWhite