绘制顺序会影响对象的深度位置吗? (包括图像)

Does the draw order affects objects position in depth? (images included)

我在场景中有几个物体,即使我指定物体 A 有 y= 10(最高的物体),从 TOP 相机我可以通过物体 A 看到底部的物体。这是一个图片来自我的场景。

直到今天我才发现一个有趣的 属性 模型的绘制顺序很重要,我可能是错的。这是另一张图片,我更改了 "ship1" 的绘制顺序,注意:"ship1" 在我的场景下面,如果我先 ship1.draw();,船就会消失(正确),但是如果我最后做 ship1.draw();,他出现在最上面(不正确)。

视频Opengl Depth Problem video

编辑:我还将我的 class 透视投影与 glm 库进行了比较,以确保这不是我的投影矩阵的问题。一切正确。

Edit1:我在 git 上有我的项目:Arkanoid git repository(windows,项目已准备好 [=7​​4=]任何安装了 VS 的计算机)

Edit2:我不使用法线或纹理。只是顶点和索引。

Edit3:如果场景中的每个对象都使用(共享)来自同一文件的顶点,是否存在问题?

Edit4:我还更改了透视投影值。我在 0.0f 有近平面,现在我有 near=20.0f 和 far=500.0f,角度=60º。但是什么都没有改变,视图改变了,但深度没有改变。 =/

Edit5: 这是我的顶点和片段着色器。

Edit6: 随时联系我,我整天都在这里,有什么事问我。目前我正在从零重写所有项目。我有两个渲染良好的立方体,一个在另一个前面。已经添加了我的 class 用于:相机、投影、着色器处理程序。移动到创建和绘制对象的 Class。

// Vertex shader

in   vec4 in_Position;
    out vec4 color;
    uniform mat4 Model;
    uniform mat4 View;
    uniform mat4 Projection;

    void main(void)
    {
        color = in_Position;
        gl_Position =   Projection * View    * Model * in_Position;
    }

// Fragment shader

       #version 330 core
    in   vec4 color;
    out vec4 out_Color;
    void main(void)
    {
        out_Color = color;
    }

一些代码:

 void setupOpenGL() {
    std::cerr << "CONTEXT: OpenGL v" << glGetString(GL_VERSION) << std::endl;
    glClearColor(0.1f, 0.1f, 0.1f, 1.0f);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glDepthMask(GL_TRUE);
    glDepthRange(0.0, 1.0);
    glClearDepth(1.0);
    glEnable(GL_CULL_FACE);
    glCullFace(GL_BACK);
    glFrontFace(GL_CCW);
}

    void display()
{
    ++FrameCount;
    glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    renderScene();
    glutSwapBuffers();
}
void renderScene()
{
    wallNorth.draw(shader);
    obstacle1.draw(shader);
    wallEast.draw(shader);
    wallWest.draw(shader);
    ship1.draw(shader);
    plane.draw(shader);
}

我已经克隆了您链接的存储库,以查看问题是否出在其他地方。在您的最新版本中,Object3D::draw 函数如下所示:

    glBindVertexArray(this->vaoID);

    glUseProgram(shader.getProgramID());
    glUniformMatrix4fv(this->currentshader.getUniformID_Model(), 1, GL_TRUE, this->currentMatrix.getMatrix());  // PPmat é matriz identidade
    glDrawElements(GL_TRIANGLES, 40, GL_UNSIGNED_INT, (GLvoid*)0);
    glBindVertexArray(0);
    glUseProgram(0);

    glClear( GL_DEPTH_BUFFER_BIT); <<< clears the current depth buffer.

最后一行在绘制每个对象后清除深度缓冲区,这意味着下一个绘制的对象没有被正确遮挡。您应该每帧只清除一次深度缓冲区。