我實現了簡單的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