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

Vol*_*kyy 5 c++ opengl shader draw

我在场景中有一些对象,即使我指定对象A的y = 10(最高对象),从TOP摄像机我可以通过对象A看到底部对象.这是我场景中的图像.

在此输入图像描述

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

在此输入图像描述

视频:Opengl Depth问题视频

  • Q1)抽奖顺序总是重要的吗?
  • Q2)我如何修复此问题,每次更改摄像机位置时是否应更改绘图顺序?

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

Edit1:我在git上有我的项目:Arkanoid git存储库(windows,项目已准备好在安装了VS的任何计算机上运行)

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

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

Edit4:我还改变了我的Perspective Projection值.我的飞机接近0.0f,现在我接近= 20.0f,远= 500.0f,角度=60º.但没有任何改变,观点确实如此,但深度不是.= /

Edit5:这是我的Vertex和Fragment着色器.

编辑6:随时联系我,我整天都在这里,所以问我什么.目前我正在从零开始重写所有项目.我有两个立方体呈现良好,一个在另一个前面.已经添加了我的类:相机,投影,着色器处理程序.移动到创建和绘制对象的类.

// 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;
    }
Run Code Online (Sandbox Code Playgroud)

一些代码:

 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);
}
Run Code Online (Sandbox Code Playgroud)

小智 7

我已克隆您链接的存储库,以查看问题是否位于其他位置.在您最新的版本中,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.
Run Code Online (Sandbox Code Playgroud)

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

  • @ n0rd如果深度相等,绘制顺序对两个比较函数都很重要.只是对于`GL_LESS`,第一个获胜,而对于'GL_LEQUAL`,最后一个获胜. (2认同)