Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. [Solved] How to get rid of shaders in the OpenGL cube example
Forum Updated to NodeBB v4.3 + New Features

[Solved] How to get rid of shaders in the OpenGL cube example

Scheduled Pinned Locked Moved General and Desktop
4 Posts 2 Posters 1.6k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • L Offline
    L Offline
    laerne
    wrote on last edited by
    #1

    Hello,

    I'm new to OpenGL programming and I feel starting right away putting all concepts like displaying, shaders or textures at the same time will just trouble me in understanding in depth how openGL works. I want to start with an (ugly) minimal white cube without lighting and add step by step textures, lighting and shaders. Unfortunately, the basic examble (cube) seems very strongly tied with textures and shaders. I tried to comment out every line involving "program", but I was not able to display the cube anymore. Can someone explain the minimal example to display a 3D cube (i.e. not using screen coordinates) with Qt ?

    Thanks a lot,
    laerne.

    1 Reply Last reply
    0
    • A Offline
      A Offline
      agocs
      wrote on last edited by
      #2

      You most certainly won't want to get rid of shaders. In modern OpenGL shaders are the only way to go. You have to have a vertex and fragment shader.

      The texturing can be stripped out easily by modifying the fragment shader not to perform texture sampling. Just set gl_FragColor to some pre-defined color instead. After that, the texture related parts in the C++ code can be removed.

      1 Reply Last reply
      0
      • L Offline
        L Offline
        laerne
        wrote on last edited by
        #3

        Thank you very much. I tried to keep shaders then, and I came up with this (I wanted clean code that do not reference textures anymore).
        But it does not display anything but a blue window of death !

        I don't understand either how OpenGL works or how Qt5 handles it… and I wonder why the "minimal" OpenGL example is so far from being minimal…

        If anyone could quickly overview the code and see if an important OpenGL call is missing that would help me. All openGL documentation tells me to use vertex arrays but as I have only OpenGL2.0, there is no such thing. Is that an issue for Qt ?

        The code tries simply to display a cube, without timer to update the view.

        @//main.cpp
        #include "glviewer.h"
        #include <QApplication>

        int main(int argc, char *argv[])
        {
        QApplication app(argc, argv);
        GLViewer w;
        w.show();

        return app.exec();
        

        }@

        @//glviewer.h
        #ifndef GLVIEWER_H
        #define GLVIEWER_H

        #include <QGLFunctions>
        #include <QGLWidget>
        #include <QGLShaderProgram>

        #include <QVector3D>

        class GLViewer : public QGLWidget, protected QGLFunctions
        {
        Q_OBJECT
        public:
        explicit GLViewer(QWidget *parent = 0);
        ~GLViewer();

        void initializeGL();
        void initShaders();
        

        // void resizeGL(int w, int h);
        void paintGL();

        signals:

        public slots:

        protected:
        GLuint bufferObject[2];
        QGLShaderProgram program;
        QMatrix4x4 projection;
        };

        #endif // GLVIEWER_H@

        @glviewer.cpp
        #include "glviewer.h"

        GLViewer::GLViewer(QWidget *parent)
        : QGLWidget(parent), QGLFunctions(),
        program(), projection()
        {
        }

        GLViewer::~GLViewer()
        {}

        void GLViewer::initializeGL()
        {
        initializeGLFunctions();
        qglClearColor(Qt::blue);

        initShaders();
        
        glEnable(GL_DEPTH_TEST);
        glEnable(GL_CULL_FACE);
        
        glViewport(0, 0, width(), height());
        projection.setToIdentity();
        projection.perspective(60, qreal(width())/qreal(height()), 1.0, 12.0);
        projection.translate(0,0,-1.5);
        

        // projection.rotate(30,1,1,1);

        glGenBuffers(2,bufferObject);
        
        static QVector3D verticesPositions[] = {
            // Vertex data for face 0
            QVector3D(-1.0, -1.0,  1.0), // v0
            QVector3D( 1.0, -1.0,  1.0), // v1
            QVector3D(-1.0,  1.0,  1.0), // v2
            QVector3D( 0.9,  0.9,  0.9), // v3
        
            // Vertex data for face 1
            QVector3D( 1.0, -1.0,  1.0), // v4
            QVector3D( 1.0, -1.0, -1.0), // v5
            QVector3D( 0.9,  0.9,  0.9), // v6
            QVector3D( 1.0,  1.0, -1.0), // v7
        
            // Vertex data for face 2
            QVector3D( 1.0, -1.0, -1.0), // v8
            QVector3D(-1.0, -1.0, -1.0), // v9
            QVector3D( 1.0,  1.0, -1.0), // v10
            QVector3D(-1.0,  1.0, -1.0), // v11
        
            // Vertex data for face 3
            QVector3D(-1.0, -1.0, -1.0), // v12
            QVector3D(-1.0, -1.0,  1.0), // v13
            QVector3D(-1.0,  1.0, -1.0), // v14
            QVector3D(-1.0,  1.0,  1.0), // v15
        
            // Vertex data for face 4
            QVector3D(-1.0, -1.0, -1.0), // v16
            QVector3D( 1.0, -1.0, -1.0), // v17
            QVector3D(-1.0, -1.0,  1.0), // v18
            QVector3D( 1.0, -1.0,  1.0), // v19
        
            // Vertex data for face 5
            QVector3D(-1.0,  1.0,  1.0), // v20
            QVector3D( 0.9,  0.9,  0.9), // v21
            QVector3D(-1.0,  1.0, -1.0), // v22
            QVector3D( 1.0,  1.0, -1.0), // v23
        };
        
        static GLushort verticesIndices[] = {
             0,  1,  2,  3,  3,     // Face 0 - triangle strip ( v0,  v1,  v2,  v3)
             4,  4,  5,  6,  7,  7, // Face 1 - triangle strip ( v4,  v5,  v6,  v7)
             8,  8,  9, 10, 11, 11, // Face 2 - triangle strip ( v8,  v9, v10, v11)
            12, 12, 13, 14, 15, 15, // Face 3 - triangle strip (v12, v13, v14, v15)
            16, 16, 17, 18, 19, 19, // Face 4 - triangle strip (v16, v17, v18, v19)
            20, 20, 21, 22, 23      // Face 5 - triangle strip (v20, v21, v22, v23)
        };
        
        // Transfer vertex data to VBO 0
        glBindBuffer(GL_ARRAY_BUFFER, bufferObject[0]);
        glBufferData(GL_ARRAY_BUFFER, 24 * sizeof(QVector3D), verticesPositions, GL_STATIC_DRAW);
        
        // Transfer index data to VBO 1
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferObject[1]);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, 34 * sizeof(GLushort), verticesIndices, GL_STATIC_DRAW);
        

        }

        void GLViewer::initShaders()
        {
        setlocale(LC_NUMERIC, "C");
        if (!program.addShaderFromSourceFile(QGLShader::Vertex, ":/shaders/default.vertex_shader.glsl"))
        close();
        if (!program.addShaderFromSourceFile(QGLShader::Fragment, ":/shaders/default.fragment_shader.glsl"))
        close();
        if (!program.link())
        close();
        if (!program.bind())
        close();
        setlocale(LC_ALL, "");
        }

        //void GLViewer::resizeGL(int w, int h)
        //{
        //}

        void GLViewer::paintGL()
        {
        glBindBuffer(GL_ARRAY_BUFFER, bufferObject[0]);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferObject[1]);

        program.setUniformValue("modelViewProjectionMatrix", projection);
        program.setUniformValue("entityBaseColor", QVector4D(1,1,1,1));
        
        int vertexLocation = program.attributeLocation("vertexPosition");
        program.enableAttributeArray(vertexLocation);
        glVertexAttribPointer(vertexLocation, 3, GL_FLOAT, GL_FALSE, sizeof(QVector3D), 0);
        
        glDrawElements(GL_TRIANGLE_STRIP, 34, GL_UNSIGNED_SHORT, 0);
        

        }
        @

        @//default.fragment_shader.glsl
        uniform vec4 entityBaseColor;

        void main(void)
        {
        gl_FragColor = entityBaseColor;
        }@

        @//default.vertex_shader.glsl
        uniform vec4 entityBaseColor;

        void main(void)
        {
        gl_FragColor = entityBaseColor;
        }@

        1 Reply Last reply
        0
        • L Offline
          L Offline
          laerne
          wrote on last edited by
          #4

          Seems it was a bad camera handling. Using manual rotations and translations simply fails (probably because it's too difficult to reason with), but lookAt is a nice alternative.

          1 Reply Last reply
          0

          • Login

          • Login or register to search.
          • First post
            Last post
          0
          • Categories
          • Recent
          • Tags
          • Popular
          • Users
          • Groups
          • Search
          • Get Qt Extensions
          • Unsolved