Question

I have a very very basic OpenGL program using glfw3 for window stuff.

Here is my main:

//Headers
#include <GL\glew.h>
#include <GLFW/glfw3.h>
#include "Utils.h"



//Function Prototypes
void setupEvents(GLFWwindow* window);


//Main function
int main(void)
{
    GLFWwindow* window;
    if (!glfwInit())    exit(EXIT_FAILURE);

    window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL);
    glewExperimental = GL_FALSE;
    GLenum error = glGetError();

    if (error != GL_NO_ERROR)
    {
        std::cout << "OpenGL Error: " << error << std::endl;
    }
    GLenum glewinit = glewInit();
    if (glewinit != GLEW_OK) {
        std::cout << "Glew not okay! " << glewinit;
        exit(EXIT_FAILURE);
    }
    if (!window){   glfwTerminate();    exit(EXIT_FAILURE); } //Failed to create window

    //Make our window current
    glfwMakeContextCurrent(window);
    setupEvents(window);

    //Let's make our program
    //GLuint glProgram = LoadShaders("../Shaders/Section_1/Basic.vert", "../Shaders/Section_1/Basic.frag");
    GLuint glProgram = LoadShaders("Basic.vert", "Basic.frag");

    while (!glfwWindowShouldClose(window))
    {
        glClear(GL_COLOR_BUFFER_BIT);

        //Swap buffers and call events.
        glfwSwapBuffers(window);
        glfwPollEvents();
    }



    //Destory our window and exit glfw.
    glfwDestroyWindow(window); 
    glfwTerminate();
    exit(EXIT_SUCCESS);
}

static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    //The key callback
    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
        glfwSetWindowShouldClose(window, GL_TRUE);
}

void setupEvents(GLFWwindow* window) {
    //Setup our events.
    glfwSetKeyCallback(window, key_callback);
} 

Utils:

#include <GL\glew.h>
#include <glm/glm.hpp>
#include <fstream> 
#include <vector>
#include <stdlib.h>
#include <algorithm>
#include <iostream>
#include <string>

using namespace std;
GLuint LoadShaders(const char * vertex_file_path, const char * fragment_file_path){

    // Create the shaders
    GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER);
    GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);

    // Read the Vertex Shader code from the file
    std::string VertexShaderCode;
    std::ifstream VertexShaderStream(vertex_file_path, std::ios::in);
    if (VertexShaderStream.is_open())
    {
        std::string Line = "";
        while (getline(VertexShaderStream, Line))
            VertexShaderCode += "\n" + Line;
        VertexShaderStream.close();
    }

    // Read the Fragment Shader code from the file
    std::string FragmentShaderCode;
    std::ifstream FragmentShaderStream(fragment_file_path, std::ios::in);
    if (FragmentShaderStream.is_open()){
        std::string Line = "";
        while (getline(FragmentShaderStream, Line))
            FragmentShaderCode += "\n" + Line;
        FragmentShaderStream.close();
    }

    GLint Result = GL_FALSE;
    int InfoLogLength;

    // Compile Vertex Shader
    printf("Compiling shader : %s\n", vertex_file_path);
    char const * VertexSourcePointer = VertexShaderCode.c_str();
    glShaderSource(VertexShaderID, 1, &VertexSourcePointer, NULL);
    glCompileShader(VertexShaderID);

    // Check Vertex Shader
    glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result);
    glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
    std::vector<char> VertexShaderErrorMessage(InfoLogLength);
    glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]);
    fprintf(stdout, "%s\n", &VertexShaderErrorMessage[0]);

    // Compile Fragment Shader
    printf("Compiling shader : %s\n", fragment_file_path);
    char const * FragmentSourcePointer = FragmentShaderCode.c_str();
    glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer, NULL);
    glCompileShader(FragmentShaderID);

    // Check Fragment Shader
    glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result);
    glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength);
    std::vector<char> FragmentShaderErrorMessage(InfoLogLength);
    glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]);
    fprintf(stdout, "%s\n", &FragmentShaderErrorMessage[0]);

    // Link the program
    fprintf(stdout, "Linking program\n");
    GLuint ProgramID = glCreateProgram();
    glAttachShader(ProgramID, VertexShaderID);
    glAttachShader(ProgramID, FragmentShaderID);
    glLinkProgram(ProgramID);

    // Check the program
    glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result);
    glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength);
    std::vector<char> ProgramErrorMessage(max(InfoLogLength, int(1)));
    glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[0]);
    fprintf(stdout, "%s\n", &ProgramErrorMessage[0]);

    glDeleteShader(VertexShaderID);
    glDeleteShader(FragmentShaderID);

    return ProgramID;
}

Output:

OpenGL Error: 1282
Glew not okay! 1

I really have no idea what I'm doing wrong.

Was it helpful?

Solution

You're checking window creation failure too lately, and you're attempting to call GL functions without active GL context. Both are wrong. It should be (copy-pasted and re-ordered your code):

GLFWwindow* window;
if (!glfwInit())    exit(EXIT_FAILURE);

window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL);
if (!window){   glfwTerminate();    exit(EXIT_FAILURE); } //Failed to create window

//Make our window current
glfwMakeContextCurrent(window);

glewExperimental = GL_FALSE;
GLenum error = glGetError();

if (error != GL_NO_ERROR)
{
    std::cout << "OpenGL Error: " << error << std::endl;
}
GLenum glewinit = glewInit();
if (glewinit != GLEW_OK) {
    std::cout << "Glew not okay! " << glewinit;
    exit(EXIT_FAILURE);
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top