-1

I'm trying to write shaders using GLSL but whenever I try to compile this code an exception gets thrown in visual studio and I have no idea how to handle it or what exactly is causing the problem here so I'd appreciate some help. The exception says:

First-chance exception at 0x00220645 in Open GL.exe: 0xC0000005: Access violation reading location 0x00D54000.

I don't really know how to go about that. When I check my output I see that everything happens as it's supposed to with the exception of two lines:

'Open GL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\ig7icd32.dll'. Cannot find or open the PDB file.
'Open GL.exe' (Win32): Loaded 'C:\Windows\SysWOW64\igdusc32.dll'. Cannot find or open the PDB file.

Here's my code:

Main.cpp

#include <iostream>
#include "Display.h"
#include "Shader.h"

int main(int argc, char *argv[])
{
    Display display(800, 600, "test");
    Shader shader("basicshader");

    while (!display.isClosed())
    {
        display.Clear(1.0f, 0.0f, 0.0f, 1.0f);
        shader.Bind();
        display.Update();
    }

    return 0;
}

Display.cpp

#pragma once
#include "Display.h"

Display::Display(int width, int height, const char *title)
{
    if (SDL_Init(SDL_INIT_EVERYTHING) == 0)
    {
        SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

        m_window = SDL_CreateWindow(title, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, SDL_WINDOW_OPENGL);
        m_context = SDL_GL_CreateContext(m_window);

        GLenum status = glewInit();
        if (status != GLEW_OK){
            std::cerr << "this is where the problem is" << std::endl;
        }
        m_isClosed = false;
    }
}


Display::~Display()
{
        std::cerr << "destructor ran" << std::endl;
        SDL_GL_DeleteContext(m_context);
        SDL_DestroyWindow(m_window);
        SDL_Quit();
}

void Display::Update()
{
    SDL_Event event;
    SDL_GL_SwapWindow(m_window);

    while (SDL_PollEvent(&event))
    {
        switch (event.type)
        {
        case SDL_QUIT:
            m_isClosed = true;
        }
    }
}

void Display::Clear(float r, float g, float b, float a)
{
    glClearColor(r, g, b, a);
    glClear(GL_COLOR_BUFFER_BIT);
}

bool Display::isClosed(){
    return m_isClosed;
}

Display.h

#pragma once
#include <SDL.h>
#include <glew.h>
#include <iostream>

class Display
{
public:
    void Update();
    void Clear(float r, float g, float b, float a);
    bool isClosed();
    Display(int width, int height, const char *title);
    virtual  ~Display();
private:
    bool m_isClosed;
    SDL_Window* m_window;
    SDL_GLContext m_context;
};

Shader.cpp

#pragma once
#include "Shader.h"

std::string Shader::LoadShader(const std::string& filename)
{

    std::ifstream file;
    std::string output;
    std::string line;
    file.open(filename.c_str());
    if (file.is_open())
    {
        while (file)
        {
            std::getline(file, line);
            output.append(line + "\n");
        }
        file.close();
        return output;
    }
}

GLuint Shader::CreateShader(const std::string& text, GLenum shadertype)
{
    GLuint shader = glCreateShader(shadertype);
    const GLchar* shadersourcestrings[1];
    GLint shadersourcelengths[1];

    shadersourcestrings[0] = text.c_str();
    shadersourcelengths[0] = text.length();

    glShaderSource(shader, 1, shadersourcestrings, shadersourcelengths);
    glCompileShader(shader);
    return shader;
}

void Shader::Bind()
{
    glUseProgram(m_program);
}


Shader::Shader(const std::string& filename)
{
    m_program = glCreateProgram();
    m_shaders[0] = CreateShader(LoadShader(filename + ".shade_v"), GL_VERTEX_SHADER);
    m_shaders[1] = CreateShader(LoadShader(filename + ".shade_f"), GL_FRAGMENT_SHADER);

    for (unsigned int i = 0; NUMOFSHADERS; i++)
    {
        glAttachShader(m_program, m_shaders[i]);  <~(breaks here)
    };

    glBindAttribLocation(m_program, 0, "position");
    glLinkProgram(m_program);
}

Shader::~Shader()
{
    for (unsigned int i = 0; NUMOFSHADERS; i++)
    {
        glDetachShader(m_program, m_shaders[i]);
        glDeleteShader(m_shaders[i]);
    }

    glDeleteProgram(m_program);
}

Shader.h

#pragma once
#include <iostream>
#include <fstream>
#include <string>
#include <glew.h>


class Shader
{
public:
    const static unsigned int NUMOFSHADERS = 2;

    GLuint m_program;
    GLuint m_shaders[NUMOFSHADERS];

    void Bind();
    static std::string LoadShader(const std::string& filename);
    static GLuint CreateShader(const std::string& text, GLenum shadertype);
    Shader(const std::string& filename);
    virtual ~Shader();
};

basicshader.shade_v

#version 120

void main()
{
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}

basicshader.shade_f

#version 120

attribute vec3 position;

void main()
{
    gl_position = vec4(postion, 1.0);
}
  • For the love of God, please *[stop reading files line by line!](http://stackoverflow.com/a/2602258/734069)* Why do people do that? – Nicol Bolas Dec 21 '15 at 05:11
  • 1
    Is this gonna help me find my solution or are u just expressing personal beef with my syntax? I don't mind reading but I'm still a beginner and it's a little harder to wrap my head around some of things mentioned, so if it's not exactly "relevant" I'd rather not waste my time on it. If it is I kinda need you to explain a little more (if it's not a problem) otherwise I'll still be stuck. – Nasir Jones Dec 21 '15 at 05:48

1 Answers1

2

One problem is if LoadShader can't open the file it will return garbage, since it falls off the end without returning anything (which results in Undefined Behavior). This could result in the problem you're seeing.

If you compile with the warnings maxed out (/W4) you'll get a warning about that ("not all control paths return a value", or something like that).

1201ProgramAlarm
  • 30,320
  • 7
  • 40
  • 49