title: Depth Buffer OpenGL Qt
body: <p>Following this tutorial <a href="https://doc.qt.io/qt-5/qtgui-openglwindow-example.html" rel="nofollow noreferrer">https://doc.qt.io/qt-5/qtgui-openglwindow-example.html</a> I was able to create a rotating triangle.</p>
  
  <p>I want to extend the example by rendering a 4-sided pyramid. (I've rendered only two triangles for clarity)</p>
  
  <p>I expect to see outer triangles of the pyramid but when rendering all sides the red one never shows, and the yellow one always shows.</p>
  
  <p>I have tried various different arrangements of glEnable(GL_DEPTH_TEST), glDepthMask(GL_TRUE), 4dimensional vectors (?), and changing the orientation of triangles, but can't find a solution.</p>
  
  <pre><code>#include "openglwindow.h"
  
  #include &lt;QtGui/QGuiApplication&gt;
  #include &lt;QtGui/QMatrix4x4&gt;
  #include &lt;QtGui/QOpenGLShaderProgram&gt;
  #include &lt;QtGui/QScreen&gt;
  
  #include &lt;QtCore/qmath.h&gt;
  
  class TriangleWindow : public OpenGLWindow
  {
  public:
      TriangleWindow();
  
      void initialize() override;
      void render() override;
  
  private:
      GLuint m_posAttr;
      GLuint m_colAttr;
      GLuint m_matrixUniform;
  
      QOpenGLShaderProgram *m_program;
      int m_frame;
  };
  
  TriangleWindow::TriangleWindow()
      : m_program(0)
      , m_frame(0)
  {
  }
  
  int main(int argc, char **argv)
  {
      QGuiApplication app(argc, argv);
  
      QSurfaceFormat format;
      format.setSamples(16);
  
      TriangleWindow window;
      window.setFormat(format);
      window.resize(640, 480);
      window.show();
  
      window.setAnimating(true);
  
      return app.exec();
  }
  
  static const char *vertexShaderSource =
      "attribute highp vec4 posAttr;\n"
      "attribute lowp vec4 colAttr;\n"
      "varying lowp vec4 col;\n"
      "uniform highp mat4 matrix;\n"
      "void main() {\n"
      "   col = colAttr;\n"
      "   gl_Position = matrix * posAttr;\n"
      "}\n";
  
  static const char *fragmentShaderSource =
      "varying lowp vec4 col;\n"
      "void main() {\n"
      "   gl_FragColor = col;\n"
      "}\n";
  
  void TriangleWindow::initialize()
  {
      m_program = new QOpenGLShaderProgram(this);
      m_program-&gt;addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSource);
      m_program-&gt;addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource);
      m_program-&gt;link();
      m_posAttr = m_program-&gt;attributeLocation("posAttr");
      m_colAttr = m_program-&gt;attributeLocation("colAttr");
      m_matrixUniform = m_program-&gt;uniformLocation("matrix");
  
  }
  
  void TriangleWindow::render()
  {
      const qreal retinaScale = devicePixelRatio();
      glViewport(0, 0, width() * retinaScale, height() * retinaScale);
  
      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  
      m_program-&gt;bind();
  
      QMatrix4x4 matrix;
      matrix.perspective(60.0f, 4.0f/3.0f, 0.1f, 100.0f);
      matrix.translate(0, 0, -1);
      matrix.rotate(100.0f * m_frame / screen()-&gt;refreshRate(), 0, 1, 0);
  
      m_program-&gt;setUniformValue(m_matrixUniform, matrix);
  
      GLfloat vertices[] = {
          0.0f, 0.577f, 0.0f, 1.0f,
          0.5f, -0.289f, 0.289f, 1.0f,
          -0.5f, -0.289f, 0.289f, 1.0f,
  
          0.0f, 0.577f, 0.0f, 1.0f,
          0.0f, -0.289f, -0.577f, 1.0f,
          0.5f, -0.289f, 0.289f, 1.0f,
  
          0.0f, 0.577f, 0.0f, 1.0f,
          -0.5f, -0.289f, 0.289f, 1.0f,
          0.0f, -0.289f, -0.577f, 1.0f,
  
          -0.5f, -0.289f, 0.289f, 1.0f,
          0.5f, -0.289f, 0.289f, 1.0f,
          0.0f, -0.289f, -0.577f, 1.0f
      };
  
      GLfloat colors[] = {
          1.0f, 0.0f, 0.0f,
          1.0f, 0.0f, 0.0f,
          1.0f, 0.0f, 0.0f,
  
          0.0f, 1.0f, 0.0f,
          0.0f, 1.0f, 0.0f,
          0.0f, 1.0f, 0.0f,
  
          0.0f, 0.0f, 1.0f,
          0.0f, 0.0f, 1.0f,
          0.0f, 0.0f, 1.0f,
  
          1.0f, 1.0f, 0.0f,
          1.0f, 1.0f, 0.0f,
          1.0f, 1.0f, 0.0f
      };
  
  
      glVertexAttribPointer(m_posAttr, 4, GL_FLOAT, GL_FALSE, 0, vertices);
      glVertexAttribPointer(m_colAttr, 3, GL_FLOAT, GL_FALSE, 0, colors);
  
      glEnableVertexAttribArray(0);
      glEnableVertexAttribArray(1);
  
      glDrawArrays(GL_TRIANGLES, 0, 6); // to only draw two faces
  
      glDisableVertexAttribArray(1);
      glDisableVertexAttribArray(0);
  
      m_program-&gt;release();
  
      ++m_frame;
  }
  </code></pre>
  
  <p><a href="https://i.stack.imgur.com/vjw5w.png" rel="nofollow noreferrer">frame from rendering 2 triangles</a>
  <a href="https://i.stack.imgur.com/ywpNe.png" rel="nofollow noreferrer">frame from rendering all triangles</a></p>
  
  <p><a href="https://i.stack.imgur.com/vjw5w.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/vjw5w.png" alt=""></a>
  <a href="https://i.stack.imgur.com/ywpNe.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/ywpNe.png" alt=""></a></p>