Results 1 to 2 of 2

Thread: Debugging empty screen with no GL errors

  1. #1
    Senior Member Regular Contributor strattonbrazil's Avatar
    Join Date
    Jun 2007
    Location
    Los Angeles, CA
    Posts
    305

    Debugging empty screen with no GL errors

    I'm trying to get an OpenGL scene working with a shader and a VBO, but I'm not getting anything to the screen. I'm fairly experienced with shaders and OpenGL in general, but I've mainly used immediate mode and I'm not sure what exactly is wrong or how to debug it. If I jump into immediate mode in my render function, I can render anything I want, but I can't see anything using the VBO/shader. No GL errors and all the functions seem to be returning the proper return values. I'm not sure how to best debug it from here.

    Code :
    void PanelGL::initializeGL()
    {
        if (!glewInitialized) {
            GLenum err = glewInit();
            if (GLEW_OK != err)
            {
                /* Problem: glewInit failed, something is seriously wrong. */
                cerr << "Error: " << glewGetErrorString(err) << endl;
            }
        }
    }
     
    void PanelGL::paintGL()
    {   
        glClearColor(0.3f, 0.3f, 0.3f, 0.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     
        glEnable(GL_DEPTH_TEST);
     
        if (!_validShaders) {
            _dummyShader = ShaderFactory::buildShader(this);
            _flatShader = ShaderFactory::buildFlatShader(this);
            _validShaders = true;
        }
     
        // render the grid
        mainGrid->render(this);
     
        glDisable(GL_DEPTH_TEST);
    }
     
    void PanelGL::resizeGL(int width, int height)
    {
        glViewport(0,0,width,height);
    }
     
    LineRenderer::LineRenderer(QVector<LineSegment> segments, float lineWidth)
    {
        _validVBOs = FALSE;
        //_segments = segments;
        _lineWidth = lineWidth;
    }
     
    struct VertexData
    {
        Vector3 position;
        Vector2 texCoord;
    };
     
    void LineRenderer::render(PanelGL* panel)
    {
        if (!_validVBOs) {
            glGenBuffers(2, (GLuint*)&amp;_vboIds);
            cout << _vboIds[0] << endl;
            cout << _vboIds[1] << endl;
     
     
            _validVBOs = TRUE;
        }
     
        loadVBOs(panel);
     
        Camera* camera = panel->camera;
        QMatrix4x4 cameraViewM = Camera::getViewMatrix(camera,panel->width(),panel->height());
        QMatrix4x4 cameraProjM = Camera::getProjMatrix(camera,panel->width(),panel->height());
        QMatrix4x4 cameraProjViewM = cameraProjM * cameraViewM;
        QMatrix4x4 objToWorld;
     
        QGLShaderProgram* flatShader = panel->getFlatShader();
     
        glLineWidth(_lineWidth);
        flatShader->bind();
        int objToWorldLoc = flatShader->attributeLocation("objToWorld");
        flatShader->setUniformValue(objToWorldLoc, objToWorld);
        int cameraPVLoc = flatShader->attributeLocation("cameraPV");
        flatShader->setUniformValue(cameraPVLoc, cameraProjViewM);
        int overrideStrengthLoc = flatShader->attributeLocation("overrideStrength");
        flatShader->setUniformValue(overrideStrengthLoc, 0.0f);
     
        // Tell OpenGL which VBOs to use
        glBindBuffer(GL_ARRAY_BUFFER, _vboIds[0]);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _vboIds[1]);
        // Offset for position
        int offset = 0;
        // Tell OpenGL programmable pipeline how to locate vertex position data
        int vertexLocation = flatShader->attributeLocation("vertex");
        cout << vertexLocation << endl;
        flatShader->enableAttributeArray(vertexLocation);
        glVertexAttribPointer(vertexLocation, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), (const void *)offset);
        // Offset for texture coordinate
        offset += sizeof(QVector3D);
        // Tell OpenGL programmable pipeline how to locate vertex texture coordinate data
        int texcoordLocation = flatShader->attributeLocation("a_texcoord");
        cout << texcoordLocation << endl;
        flatShader->enableAttributeArray(texcoordLocation);
        glVertexAttribPointer(texcoordLocation, 2, GL_FLOAT, GL_FALSE, sizeof(VertexData), (const void *)offset);
        // Draw cube geometry using indices from VBO 1
        glDrawElements(GL_TRIANGLE_STRIP, 34, GL_UNSIGNED_SHORT, 0);
     
        if (glGetError() == 0) {
            cout << "Fine" << endl;
        } else {
            cout << "Oops" << endl;
        }
     
        //drawSegments.call
        flatShader->release();
    }
     
    void LineRenderer::drawSegments(QGLShaderProgram* program)
    {
     
    }
     
    void LineRenderer::loadVBOs(PanelGL* panel)
    {
        VertexData vertices[] = {
                // Vertex data for face 0
                {QVector3D(-1.0, -1.0,  1.0), QVector2D(0.0, 0.0)},  // v0
                {QVector3D( 1.0, -1.0,  1.0), QVector2D(0.33, 0.0)}, // v1
                {QVector3D(-1.0,  1.0,  1.0), QVector2D(0.0, 0.5)},  // v2
                {QVector3D( 1.0,  1.0,  1.0), QVector2D(0.33, 0.5)}, // v3
                // Vertex data for face 1
                {QVector3D( 1.0, -1.0,  1.0), QVector2D( 0.0, 0.5)}, // v4
                {QVector3D( 1.0, -1.0, -1.0), QVector2D(0.33, 0.5)}, // v5
                {QVector3D( 1.0,  1.0,  1.0), QVector2D(0.0, 1.0)},  // v6
                {QVector3D( 1.0,  1.0, -1.0), QVector2D(0.33, 1.0)}, // v7
                // Vertex data for face 2
                {QVector3D( 1.0, -1.0, -1.0), QVector2D(0.66, 0.5)}, // v8
                {QVector3D(-1.0, -1.0, -1.0), QVector2D(1.0, 0.5)},  // v9
                {QVector3D( 1.0,  1.0, -1.0), QVector2D(0.66, 1.0)}, // v10
                {QVector3D(-1.0,  1.0, -1.0), QVector2D(1.0, 1.0)},  // v11
                // Vertex data for face 3
                {QVector3D(-1.0, -1.0, -1.0), QVector2D(0.66, 0.0)}, // v12
                {QVector3D(-1.0, -1.0,  1.0), QVector2D(1.0, 0.0)},  // v13
                {QVector3D(-1.0,  1.0, -1.0), QVector2D(0.66, 0.5)}, // v14
                {QVector3D(-1.0,  1.0,  1.0), QVector2D(1.0, 0.5)},  // v15
                // Vertex data for face 4
                {QVector3D(-1.0, -1.0, -1.0), QVector2D(0.33, 0.0)}, // v16
                {QVector3D( 1.0, -1.0, -1.0), QVector2D(0.66, 0.0)}, // v17
                {QVector3D(-1.0, -1.0,  1.0), QVector2D(0.33, 0.5)}, // v18
                {QVector3D( 1.0, -1.0,  1.0), QVector2D(0.66, 0.5)}, // v19
                // Vertex data for face 5
                {QVector3D(-1.0,  1.0,  1.0), QVector2D(0.33, 0.5)}, // v20
                {QVector3D( 1.0,  1.0,  1.0), QVector2D(0.66, 0.5)}, // v21
                {QVector3D(-1.0,  1.0, -1.0), QVector2D(0.33, 1.0)}, // v22
                {QVector3D( 1.0,  1.0, -1.0), QVector2D(0.66, 1.0)}  // v23
            };
            // Indices for drawing cube faces using triangle strips.
            // Triangle strips can be connected by duplicating indices
            // between the strips. If connecting strips have opposite
            // vertex order then last index of the first strip and first
            // index of the second strip needs to be duplicated. If
            // connecting strips have same vertex order then only last
            // index of the first strip needs to be duplicated.
            GLushort indices[] = {
                 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, _vboIds[0]);
            glBufferData(GL_ARRAY_BUFFER, 24 * sizeof(VertexData), vertices, GL_STATIC_DRAW);
     
            // Transfer index data to VBO 1
            glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _vboIds[1]);
            glBufferData(GL_ELEMENT_ARRAY_BUFFER, 34 * sizeof(GLushort), indices, GL_STATIC_DRAW);
    }

    Code :
    QGLShaderProgram* ShaderFactory::buildFlatShader(QObject *parent)
    {
        string vertSource = string("in vec3 vertex;\n" \
                                   "in vec2 a_texcoord;\n" \
                                   "uniform mat4 objToWorld;\n" \
                                   "uniform mat4 cameraPV;\n" \
                                   "void main() {\n" \
                                   "  gl_Position = cameraPV * objToWorld * vec4(vertex,1.0);\n" \
                                   "  gl_FrontColor = vec4(a_texcoord.x, 1, 0, 1);\n" \
                                   "}\n");
     
        string fragSource = string("void main() {\n" \
                                   "  gl_FragColor = gl_Color;\n" \
                                   "}\n");
     
        QGLShader* vertShader = new QGLShader(QGLShader::Vertex);
        vertShader->compileSourceCode(vertSource.c_str());
     
        QGLShader* fragShader = new QGLShader(QGLShader::Fragment);
        fragShader->compileSourceCode(fragSource.c_str());
     
        QGLShaderProgram* program = new QGLShaderProgram(parent);
        program->addShader(vertShader);
        program->addShader(fragShader);
     
        program->link();
     
        cout << program->log().toStdString() << endl;
        cout << "Log end--" << endl;
     
        return program;
    }

  2. #2
    Member Contributor
    Join Date
    Sep 2010
    Posts
    74

    Re: Debugging empty screen with no GL errors

    Are you sure your window has a depth-buffer? If that is not the problem, I would try disabling pieces of the code to see if the problem disappears. Also, try looking at this thread, I had similar problems once.

Similar Threads

  1. White Screen of death, no errors logged.
    By Delupara in forum OpenGL: Windows
    Replies: 1
    Last Post: 08-16-2018, 10:42 AM
  2. mat4 and vec4 multiplication produces empty screen
    By Bilgin in forum OpenGL: GLSL
    Replies: 2
    Last Post: 08-06-2018, 02:22 AM
  3. Arbitrary OpenGL Errors in empty Game Loop
    By JimmyLaessig in forum OpenGL: Basic Coding
    Replies: 0
    Last Post: 11-07-2015, 09:03 AM
  4. debugging shader with no errors
    By strattonbrazil in forum OpenGL: GLSL
    Replies: 4
    Last Post: 11-11-2008, 10:09 AM
  5. Why Does This Program Display Only An Empty Screen Window?
    By sjsearcher in forum OpenGL: Basic Coding
    Replies: 1
    Last Post: 01-08-2002, 12:20 PM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Proudly hosted by Digital Ocean