Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 绘制顺序是否影响对象的深度位置?(包括图片)_C++_Opengl_Shader_Draw - Fatal编程技术网

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

C++ 绘制顺序是否影响对象的深度位置?(包括图片),c++,opengl,shader,draw,C++,Opengl,Shader,Draw,我在场景中有几个对象,即使我指定对象a的y=10(最高的对象),从顶部摄影机我可以通过对象a看到底部对象。这是我场景中的图像 直到今天,我才发现了一个有趣的属性,它可以绘制模型的顺序,我可能错了。这里是另一张图片,我改变了“ship1”的绘制顺序,注意:如果我做ship1.draw()首先,飞船消失(正确),但如果我这样做ship1.draw()在最后,他出现在顶部(不正确) 视频: Q1)提款顺序是否始终重要 问题2)如何解决此问题,我是否应该在每次更改相机位置时更改绘图顺序 编辑:我

我在场景中有几个对象,即使我指定对象a的y=10(最高的对象),从顶部摄影机我可以通过对象a看到底部对象。这是我场景中的图像

直到今天,我才发现了一个有趣的属性,它可以绘制模型的顺序,我可能错了。这里是另一张图片,我改变了“ship1”的绘制顺序,注意:如果我做
ship1.draw()首先,飞船消失(正确),但如果我这样做
ship1.draw()在最后,他出现在顶部(不正确)

视频

  • Q1)提款顺序是否始终重要
  • 问题2)如何解决此问题,我是否应该在每次更改相机位置时更改绘图顺序
编辑:我还将我的透视投影类与glm库进行了比较,以确保投影矩阵没有问题。一切都是正确的

Edit1:我在git上有我的项目:(windows,项目可以在任何安装了VS的计算机上运行)

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

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

Edit4:我还更改了透视投影值。我在0.0f下有一个近平面,现在我有近=20.0f和远=500.0f,角度=60º。但一切都不会改变,视图会改变,但深度不会改变=/

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

Edit6:随时与我联系,我整天都在这里,所以问我任何问题。目前,我正在重写从零开始的所有项目。我有两个立方体,一个在另一个前面,呈现得很好。已经为添加了mine类:摄影机、投影、着色器处理程序。移动到创建和绘制对象的类

// 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);
}
void setupOpenGL(){

std::cerr我已克隆了您链接的存储库,以查看问题是否位于其他地方。在您的最新版本中,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.
glBindVertexArray(this->vaoID);
glUseProgram(shader.getProgramID());
glUniformMatrix4fv(this->currentshader.getUniformID_Model(),1,GL_TRUE,this->currentMatrix.getMatrix());//PPmatématriz identidade
gld元素(GL_三角形,40,GL_无符号整数,(GLvoid*)0);
glBindVertexArray(0);
glUseProgram(0);

glClear(GL_DEPTH_BUFFER_BIT);您是否有深度缓冲区?启用了深度测试?您通过在传递给
glutInitDisplayMode()的标志中包含
GLUT_DEPTH
来请求深度缓冲区
?不确定问题出在哪里。最常见的问题是没有深度缓冲区/测试,或者没有深度范围(远近比)的投影矩阵这太大了。你的近剪裁平面和远剪裁平面是什么?如果你使用可编程顶点或碎片着色器,你可能需要确保它们正确处理深度值。我还建议使用
GL\u LESS
进行深度测试,而不是
GL\u LEQUAL
进行后期绘制顺序(当两个对象具有相同深度时)GL_LEQUAL在多次为同一个曲面着色时可能很有用,例如贴花或多次光照。但在这种情况下,使用GL_LESS可能是个好主意。@n0rd如果深度相等,绘制顺序对两个比较函数都很重要。只是对于
GL_LESS
,第一个获胜,对于
GL_LEQUAL
>最后一个赢了。谢谢!多么简单的错误。这个错误发生在哪里,是glGetError()的结果吗?在它之前发生了哪个操作?