White Screen Load on GL Launch

ISSUE: When launched, GLWindow displays only a white screen and the cursor displays a loading circle, signifying that something is still being loaded. The window displays “Not Responding” shortly after that.

I have tried downgrading to openGL 3.3 and have used glad to help with that, but the problem persists.

Hello all,

I’ve been working to create a sphere with alternating colors using a vertex shader.

The code that I’ve shared below was slightly altered from code that was used to shade a quad, which worked fine. I expect that there will be issues with similar logic being used to shade a circle, or to build a sphere and shade that. I am NOT at that point yet however. Something is keeping my GL Window from displaying properly and I am hoping that someone can help me with my GLFW and glew logic to share why the window is failing to load.

Primary Class

#include <iostream>
#include <sstream>
    //always GLEW before GLFW
#include "GL/glew.h"    
#include "GLFW/glfw3.h"
#include "glm/glm.hpp"

#include "ShaderProgram.h"

#ifndef M_PI
# define M_PI 3.141592653

GLFWwindow* w = NULL;
const int wWidth = 800;
const int wHeight = 600;

void key_callback(GLFWwindow *w, int key, int scancode, int action, int mode);
//update colors based on average framerate
void averageFPS(GLFWwindow* window);
//screen resizing
void glfw_onFramebufferSize(GLFWwindow* window, int width, int height);
bool initOpenGL();

static void error(int error, const char *desc)
    fputs(desc, stderr);
//setting up values for keys

int main() {

    if (!initOpenGL())    ///5IMPR
        // An error occured
        std::cerr << "GLFW not initialized" << std::endl;
        return -1;

    GLfloat vertices[] = {
        -0.5f,  0.5f, 0.0f,        
        0.5f,  0.5f, 0.0f,        
        -0.5f, 1.0f, 0.0f        

    GLuint indices[] = {
        0, 1, 2,  
        0, 2, 3   

    // 2. Set up buffers on the GPU
    GLuint vbo, ibo, vao;                        

    glGenBuffers(1, &vbo);                    // Generate an empty vertex buffer on the GPU
    glBindBuffer(GL_ARRAY_BUFFER, vbo);        // "bind" or set as the current buffer we are working with
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);    // copy the data from CPU to GPU

    glGenVertexArrays(1, &vao);                // Tell OpenGL to create new Vertex Array Object
    glBindVertexArray(vao);                    // Make it the current one
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);    // Define a layout for the first vertex buffer "0"
    glEnableVertexAttribArray(0);            // Enable the first attribute or attribute "0"

                                            // Set up index buffer
    glGenBuffers(1, &ibo);    // Create buffer space on the GPU for the index buffer
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

    glBindVertexArray(0);                    // unbind to make sure other code doesn't change it

    ShaderProgram shaderProgram;        
    shaderProgram.assignShaders("shaders/ColorShader.vert", "shaders/ColorShader.frag"); 

            ////////SETUP RENDERING
    while (!glfwWindowShouldClose(w))

            //process events

            // Clear the screen


        GLfloat time = (GLfloat)glfwGetTime();            
        GLfloat blueSetting = (sin(time) / 2) + 0.5f;        
        glm::vec2 pos;
        pos.x = sin(time) / 2;
        pos.y = cos(time) / 2;
        shaderProgram.setUniform("vertColor", glm::vec4(0.0f, 0.0f, blueSetting, 1.0f));    
        shaderProgram.setUniform("posOffset", pos);

            /////COLOR OF CIRCLE OUTLINE
        //glColor4f(0.0, 0.0, 1.0, 1.0); //RGBA
            //PRIMARY BODY
                    // Draw our line


        static double iteration = 0;
        // The x, y offset onto the screen -- this should later be centered
        static const int offset = 150;

        static const float radius = 50;

        // Calculate our x, y cooredinates
        double x1 = offset + radius + 100 * cos(1);
        double y1 = offset + radius + 100 * sin(1);
        static double wobble = 0.0;

        // A = (π * r²)
        double a = M_PI * (100 * 2);    //area
                                        // C = (2 * π * r)
        double c = 2 * M_PI * 100;    //circumference

        static double b = 128;

        for (double i = 0; i < 2 * M_PI; i = i + ((2 * M_PI) / b))
            double x = x1 + radius * cos(i);

            double y = y1 + radius * sin(i);

            glVertex2f(x, y);

            glVertex2f(x, y);

        iteration += 0.01;

        ////PRIMARY BODY End
        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
            //glDrawElements(GL_LINE_LOOP, 6, GL_UNSIGNED_INT, 0);
        // Swap buffers and look for events


        //clean up
    glDeleteVertexArrays(1, &vao);
    glDeleteBuffers(1, &vbo);
    glDeleteBuffers(1, &ibo);

    return 0;

            ///////START Initializing glfw glew etc
bool initOpenGL(){

    //this method will exit on these conditions
    GLuint error = glfwInit();
    if (!error)
        return false;
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);

    w = glfwCreateWindow(wWidth, wHeight, "Exercise", NULL, NULL);
    //Filling  Window
    if (w== NULL)
        std::cerr << "glfw window not created" << std::endl;
        return false;

        //update context

    // Initialize GLEWunifor
    glewExperimental = GL_TRUE;
    GLuint err = glewInit();
    if (err != GLEW_OK)
        std::cerr << "initialize GLEW Failed" << std::endl;
        return false;

        //setup key callbacks
    glfwSetKeyCallback(w, key_callback);
    glfwSetFramebufferSizeCallback(w, glfw_onFramebufferSize);
    while (!glfwWindowShouldClose(w))
        //int width, height;
    //    glfwGetFramebufferSize(w, &width, &height); //move out of while??

        // glViewport(0, 0, width, height);    //remove??
    glClearColor(0.23f, 0.38f, 0.47f, 1.0f);    ///5ADD

                                                // Define the viewport dimensions
    glViewport(0, 0, wWidth, wHeight);    //necessary?

    return true;


void key_callback(GLFWwindow *w, int key, int scancode, int action, int mode)
    // See http://www.glfw.org/docs/latest/group__keys.html
    if ((key == GLFW_KEY_ESCAPE || key == GLFW_KEY_Q) && action == GLFW_PRESS)
        glfwSetWindowShouldClose(w, GL_TRUE);

    if (key == GLFW_KEY_W && action == GLFW_PRESS)
        bool showWires = false;
        if (showWires)
            glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
            glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);


    //whever window resizes, do this
void glfw_onFramebufferSize(GLFWwindow* window, int width, int height)
    glViewport(0, 0, width, height);

void averageFPS(GLFWwindow* window)    ///5ADDdown
    static double previousSeconds = 0.0;
    static int frameCount = 0;
    double passedSeconds;
    double currentSeconds = glfwGetTime(); //seconds since GLFW started

    passedSeconds = currentSeconds - previousSeconds;

    // Limit time updates to 4 times per second
    if (passedSeconds > 0.25)
        previousSeconds = currentSeconds;
        double fps = (double)frameCount / passedSeconds;
    //    double frameInMilSecs = 1000.0 / fps;
         frameCount = 0;} 

Shader Manager/Handler Class

#include "ShaderProgram.h"
#include <fstream>
#include <iostream>
#include <sstream>

    : mProgram(0){


bool ShaderProgram::assignShaders(const char* vertFileName, const char* fragFileName)
    //Shaders output objects called programs that define their relationship and lead to .exe functionality

    //assigning pointer to the shader
        string vsString = readFile(vertFileName);
        string fsString = readFile(fragFileName);
    const GLchar* fsSourcePtr = fsString.c_str();
    const GLchar* vsSourcePtr = vsString.c_str();

    //creating vertex shader(vs) shader object
    GLuint vs = glCreateShader(GL_VERTEX_SHADER);
    GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);

    //assigning shader source using address. Replaces the source code in a shader object //@arg (shader, count Strings, pointer to const File ,size)
    glShaderSource(vs, 1, &vsSourcePtr, NULL);
    glShaderSource(fs, 1, &fsSourcePtr, NULL);



    //createProgram returns GLUint which is basically an unsigned int... we will use This Handler to create a program object
    mProgram = glCreateProgram();
    if (mProgram == 0)
        std::cerr << "Shader cannot be created" << std::endl;
        return false;
    //assign the program object(mProgram) to the Shader
    glAttachShader(mProgram, vs);
    glAttachShader(mProgram, fs);

    //this method accepts a GLuint "program" . If its an object of type GL_VERTEX_SHADER,
    //itll create a .exe that runs on the programmable vertex processor. same goes for geometric and fragment shaders if they were included
    //it will also bind all user defined uniform variables and attributes to the program 
    //The program can then be made part of a defined state by calling useProgram

    //cleaning up the elements we already used
        //clear the identifier lookup map(in this case, there's only one)

    return true;
}//end main

    //Read the shaderFile. strngstream for reading multiple lines
string ShaderProgram:: readFile(const string& filename) {

    std::stringstream strgstream;
    std::ifstream file;

        file.open(filename, std::ios::in);

        if (!file.fail())
            strgstream << file.rdbuf();

    catch (std::exception e)
        std::cerr << "Error: File or File Name Issues" << std::endl;

    return strgstream.str();
    //use the Program Object we created in this current state(color)
void ShaderProgram::use()
    if (mProgram != 0)

void ShaderProgram::testProgramCompile() {
    int status = 0;

    GLuint program = mProgram;
        // ///CHECKING GL_LINK_STATUS to see if Program Link was successul. Link Status will return GL_TRUE if it was
        glGetProgramiv( mProgram, GL_LINK_STATUS, &status); //requesting the status
        if (status == GL_FALSE)

            std::cerr << "Linking Error with Program " << std::endl;
void ShaderProgram :: testShaderCompile(GLuint shader) {
    int status = 0;

    // ///CHECKING GL_LINK_STATUS to see if Program Link was successul. Link Status will return GL_TRUE if it was
    glGetProgramiv(shader, GL_LINK_STATUS, &status); //requesting the status
    if (status == GL_FALSE)

        std::cerr << "Linking Error with Shader " << std::endl;


GLuint ShaderProgram::getProgram() const
    return mProgram;

void ShaderProgram::setUniform(const GLchar* name, const glm::vec2& v)
    GLint address = getUniformIdentifier(name);
    glUniform2f(address, v.x, v.y);

void ShaderProgram::setUniform(const GLchar* name, const glm::vec3& v)
    GLint address = getUniformIdentifier(name);
    glUniform3f(address, v.x, v.y, v.z);

void ShaderProgram:: setUniform(const GLchar* name, const glm::vec4& v) {
    GLint address = getUniformIdentifier(name);
    glUniform4f(address, v.x, v.y, v.z, v.w);

//Maybe need to switch places with setUniform
GLint ShaderProgram :: getUniformIdentifier(const GLchar* name) {

    std::map<std::string, GLint>::iterator it;
    it = mUniformIdentifiers.find(name);
    //std::map<std::string, GLint>

        // Only need to query the shader program IF it doesn't already exist.
        if (it == mUniformIdentifiers.end())
            // Find it and add it to the map
            mUniformIdentifiers[name] = glGetUniformLocation(mProgram, name);

        // Return it
        return mUniformIdentifiers[name];

Without using proper code tags it’s difficult to read this, but straight off I can see that you seem to have a glBegin without a matching glEnd. Mixing glBegin/glEnd code with modern GL drawing is also slightly odd, but (so long as you create a compatibility context) no reason why it wouldn’t work (assuming everything else is correct).