Search code examples
c++openglglutglm-math

OpenGL Showing White Box, instead of cube


So I am just getting started with OpenGL/GLEW and I am trying to create a cube however, when attempting to run this code I only get a white box.

I have tried to run on several computers but all come up the same.

#include <iostream>
#include <GL/glew.h>
#include <GL/freeglut.h>

//GLM OpenMath Header
#include <GL/glm/glm.hpp>
#include <GL/glm/gtc/matrix_transform.hpp>
#include <GL/glm/gtc/type_ptr.hpp>

using namespace std; //standard namespace

#define WINDOW_TITLE "JShinaberry Activity 5" //window title

//Shader program
#ifndef GLSL
#define GLSL(Version, Source) "#version " #Version "\n" #Source
#endif

//Variable declarations for shader, window size init buffer and array objs

GLint shaderProgram, WindowWidth = 800, WindowHeight = 600;
GLuint VBO, VAO, EBO, texture;

//Function Prototypes
void UResizeWindow(int,int);
void URenderGraphics(void);
void UCreateShader(void);
void UCreateBuffers(void);


//vertex shader source code
const GLchar * vertexShaderSource = GLSL(330,
        layout (location = 0) in vec3 position;
        layout (location = 1) in vec3 color;

        out vec3 mobileColor;

        uniform mat4 model;
        uniform mat4 view;
        uniform mat4 projection;

void main(){
        gl_Postion = projection * view * model * vec4(postion, 1.0f);
        mobileColor = color;
    }
);


//fragment shader source code
const GLchar * fragmentShaderSource = GLSL(330,
        in vec3 mobileColor;

        out vec4 gpuColor;

    void main(){

        gpuColor = vec4(mobileColor, 1.0);

    }
);

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowSize(WindowWidth, WindowHeight);
    glutCreateWindow(WINDOW_TITLE);

    glutReshapeFunc(UResizeWindow);

    glewExperimental = GL_TRUE;
        if (glewInit() != GLEW_OK)
        {
            std::cout << "Failed to initialize GLEW" << std::endl;
            return -1;
        }

    UCreateShader();

    UCreateBuffers();

    //use the shader program
    glUseProgram(shaderProgram);

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

    glutDisplayFunc(URenderGraphics);

    glutMainLoop();

    //destroys buffer objects once used
    glDeleteVertexArrays(1, &VAO);
    glDeleteBuffers(1, &VBO);
    glDeleteBuffers(1, &EBO);

    return 0;

}

//Resize the Window

void UResizeWindow(int w, int h)
{
    WindowWidth = w;
    WindowHeight = h;
    glViewport(0, 0, WindowWidth, WindowHeight);

}

void URenderGraphics(void)
{
    glEnable(GL_DEPTH_TEST);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glBindVertexArray(VAO); //Activate the vertex array object before rendering

    //declares a 4x4 identity martix
    glm::mat4 model;
    model = glm::translate(model, glm::vec3(0.0, 0.0f, 0.0f));
    model = glm::rotate(model, 45.0f, glm::vec3(1.0, 1.0f, 1.0f));
    model = glm::scale(model, glm::vec3(2.0f, 2.0f, 2.0f));


    glm::mat4 view;
    view = glm::translate(view, glm::vec3(0.5f, 0.0f, -5.0f));

    glm::mat4 projection;
    projection = glm::ortho(-5.0f, 5.0f, -5.0f, 5.0f, 0.1f, 100.0f);

    GLint modelLoc = glGetUniformLocation(shaderProgram, "model");
    GLint viewLoc = glGetUniformLocation(shaderProgram, "view");
    GLint projLoc = glGetUniformLocation(shaderProgram, "projection");

    glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));
    glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));
    glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(projection));

    glutPostRedisplay();

    //Draw the triangles
    glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0);

    glBindVertexArray(0); //Deactivate the vertex array object

    glutSwapBuffers();

}

//creates the shader program

void UCreateShader()
{
    //vertex shader
    GLint vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
    glCompileShader(vertexShader);

    //fragment shader
    GLint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
    glCompileShader(fragmentShader);

    //shader program
    shaderProgram = glCreateProgram();
    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);
    glLinkProgram(shaderProgram);

    //delete the vertex and fragment shaders once linked
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);

}

//creates the buffer and array
void UCreateBuffers()
{

    //position and color data
    GLfloat vertices[] = {
            0.0f,  0.5f,  0.0f,  1.0f, 0.0f, 0.0f,
            0.5f, -0.5f,  0.0f,  0.0f, 1.0f, 0.0f,
           -0.5f, -0.5f,  0.0f,  0.0f, 0.0f, 1.0f,
           -0.5f,  0.5f,  0.0f,  1.0f, 0.0f, 1.0f,

           0.5f, -0.5f, -1.0f,   0.5f, 0.5f, 1.0f,
           0.5f,  0.5f, -1.0f,   1.0f, 1.0f, 0.5f,
          -0.5f,  0.5f, -1.0f,   0.2f, 0.2f, 0.5f,
          -0.5f, -0.5f, -1.0f,   1.0f, 0.0f, 1.0f

                        };
    //index data to share position
    GLuint indices[] = {
                            0, 1, 3,
                            1, 2, 3,
                            0, 1, 4,
                            0, 4, 5,
                            0, 5, 6,
                            0, 3, 6,
                            4, 5, 6,
                            4, 6, 7,
                            2, 3, 6,
                            2, 6, 7,
                            1, 4, 7,
                            1, 2, 7
                        };

    //Generate buffer ids
    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);
    glGenBuffers(1, &EBO);

    glBindVertexArray(VAO);

    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0);
    glEnableVertexAttribArray(0);

    glVertexAttribPointer (1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
    glEnableVertexAttribArray(1);

    glBindVertexArray(0);

}

I have ran through this line by line and I am clueless as to why it isn't running. I though my vertices were off but it should be fine.


Solution

  • A few things:

    1. Misspellings in your vertex shader:

      • gl_Postion (wrong) != gl_Position (correct)
      • position != postion (inconsistent)

      Make sure to check the shader & program compile & link statuses via glGetShaderiv(..., GL_COMPILE_STATUS, ...) & glGetProgramiv(..., GL_LINK_STATUS, ...) next time; if they return GL_FALSE that means they've failed to compile/link and that there's (usually) diagnostic info in the shader/program info logs (glGetShaderInfoLog()/glGetProgramInfoLog()).

    2. GLM no longer default-initializes vectors to (0, 0, 0, 1) or matrices to the identity matrix.

      So in constructs like this:

      glm::mat4 view;
      view = glm::translate(view, glm::vec3(0.5f, 0.0f, -5.0f));
      

      view will default to...something. Garbage, most likely, especially in Release mode.

      Passing garbage into glm::translate() usually isn't a good use of your time :)

      Either #define GLM_FORCE_CTOR_INIT before your #include GLM or init your GLM objects to something sane:

      glm::mat4 view( 1.0f );
      
    3. You're using enough Core-like functionality that you're better off requesting an actual versioned Core context:

      glutInitContextVersion( 3, 3 );
      glutInitContextProfile( GLUT_CORE_PROFILE );
      

    All together:

    enter image description here

    #include <iostream>
    #include <GL/glew.h>
    #include <GL/freeglut.h>
    
    //GLM OpenMath Header
    #include <glm/glm.hpp>
    #include <glm/gtc/matrix_transform.hpp>
    #include <glm/gtc/type_ptr.hpp>
    
    using namespace std; //standard namespace
    
    #define WINDOW_TITLE "JShinaberry Activity 5" //window title
    
    GLint shaderProgram, WindowWidth = 800, WindowHeight = 600;
    GLuint VBO, VAO, EBO, texture;
    
    //Function Prototypes
    void UResizeWindow(int,int);
    void URenderGraphics(void);
    void UCreateBuffers(void);
    
    void CheckStatus( GLuint obj, bool isShader )
    {
        GLint status = GL_FALSE, log[ 1 << 11 ] = { 0 };
        ( isShader ? glGetShaderiv : glGetProgramiv )( obj, isShader ? GL_COMPILE_STATUS : GL_LINK_STATUS, &status );
        ( isShader ? glGetShaderInfoLog : glGetProgramInfoLog )( obj, sizeof( log ), NULL, (GLchar*)log );
        if( status == GL_TRUE ) return;
        std::cerr << (GLchar*)log << "\n";
        std::exit( EXIT_FAILURE );
    }
    
    void AttachShader( GLuint program, GLenum type, const char* src )
    {
        GLuint shader = glCreateShader( type );
        glShaderSource( shader, 1, &src, NULL );
        glCompileShader( shader );
        CheckStatus( shader, true );
        glAttachShader( program, shader );
        glDeleteShader( shader );
    }
    
    //vertex shader source code
    const char* vert = 1 + R"GLSL(
    #version 330 core
    layout (location = 0) in vec3 position;
    layout (location = 1) in vec3 color;
    out vec3 mobileColor;
    uniform mat4 model;
    uniform mat4 view;
    uniform mat4 projection;
    void main()
    {
        gl_Position = projection * view * model * vec4(position, 1.0f);
        mobileColor = color;
    }
    )GLSL";
    
    //fragment shader source code
    const char* frag = 1 + R"GLSL(
    #version 330 core
    in vec3 mobileColor;
    out vec4 gpuColor;
    void main()
    {
        gpuColor = vec4(mobileColor, 1.0);
    }
    )GLSL";
    
    int main(int argc, char* argv[])
    {
        glutInit(&argc, argv);
        glutInitContextVersion( 3, 3 );
        glutInitContextProfile( GLUT_CORE_PROFILE );
        glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
        glutInitWindowSize(WindowWidth, WindowHeight);
        glutCreateWindow(WINDOW_TITLE);
    
        glutReshapeFunc(UResizeWindow);
    
        glewExperimental = GL_TRUE;
        if (glewInit() != GLEW_OK)
        {
            std::cout << "Failed to initialize GLEW" << std::endl;
            return -1;
        }
    
        //use the shader program
        shaderProgram = glCreateProgram();
        AttachShader( shaderProgram, GL_VERTEX_SHADER, vert );
        AttachShader( shaderProgram, GL_FRAGMENT_SHADER, frag );
        glLinkProgram( shaderProgram );
        CheckStatus( shaderProgram, false );
        glUseProgram( shaderProgram );
    
        UCreateBuffers();
    
        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    
        glutDisplayFunc(URenderGraphics);
    
        glutMainLoop();
    
        //destroys buffer objects once used
        glDeleteVertexArrays(1, &VAO);
        glDeleteBuffers(1, &VBO);
        glDeleteBuffers(1, &EBO);
    
        return 0;
    
    }
    
    void UResizeWindow(int w, int h)
    {
        WindowWidth = w;
        WindowHeight = h;
        glViewport(0, 0, WindowWidth, WindowHeight);
    }
    
    void URenderGraphics(void)
    {
        glEnable(GL_DEPTH_TEST);
    
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
        glBindVertexArray(VAO); //Activate the vertex array object before rendering
    
        //declares a 4x4 identity martix
        glm::mat4 model( 1.0f );
        model = glm::translate(model, glm::vec3(0.0, 0.0f, 0.0f));
        model = glm::rotate(model, 45.0f, glm::vec3(1.0, 1.0f, 1.0f));
        model = glm::scale(model, glm::vec3(2.0f, 2.0f, 2.0f));
    
    
        glm::mat4 view( 1.0f );
        view = glm::translate(view, glm::vec3(0.5f, 0.0f, -5.0f));
    
        glm::mat4 projection;
        projection = glm::ortho(-5.0f, 5.0f, -5.0f, 5.0f, 0.1f, 100.0f);
    
        GLint modelLoc = glGetUniformLocation(shaderProgram, "model");
        GLint viewLoc = glGetUniformLocation(shaderProgram, "view");
        GLint projLoc = glGetUniformLocation(shaderProgram, "projection");
    
        glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));
        glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));
        glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(projection));
    
        glutPostRedisplay();
    
        //Draw the triangles
        glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0);
    
        glBindVertexArray(0); //Deactivate the vertex array object
    
        glutSwapBuffers();
    }
    
    //creates the buffer and array
    void UCreateBuffers()
    {
        //position and color data
        GLfloat vertices[] =
        {
            0.0f,  0.5f,  0.0f,  1.0f, 0.0f, 0.0f,
            0.5f, -0.5f,  0.0f,  0.0f, 1.0f, 0.0f,
            -0.5f, -0.5f,  0.0f,  0.0f, 0.0f, 1.0f,
            -0.5f,  0.5f,  0.0f,  1.0f, 0.0f, 1.0f,
    
            0.5f, -0.5f, -1.0f,   0.5f, 0.5f, 1.0f,
            0.5f,  0.5f, -1.0f,   1.0f, 1.0f, 0.5f,
            -0.5f,  0.5f, -1.0f,   0.2f, 0.2f, 0.5f,
            -0.5f, -0.5f, -1.0f,   1.0f, 0.0f, 1.0f,
        };
    
        //index data to share position
        GLuint indices[] =
        {
            0, 1, 3,
            1, 2, 3,
            0, 1, 4,
            0, 4, 5,
            0, 5, 6,
            0, 3, 6,
            4, 5, 6,
            4, 6, 7,
            2, 3, 6,
            2, 6, 7,
            1, 4, 7,
            1, 2, 7,
        };
    
        //Generate buffer ids
        glGenVertexArrays(1, &VAO);
        glGenBuffers(1, &VBO);
        glGenBuffers(1, &EBO);
    
        glBindVertexArray(VAO);
    
        glBindBuffer(GL_ARRAY_BUFFER, VBO);
        glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
    
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0);
        glEnableVertexAttribArray(0);
    
        glVertexAttribPointer (1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
        glEnableVertexAttribArray(1);
    
        glBindVertexArray(0);
    }