C++ Glfw and glad shader error what to do?



  • Good day,
    i try to learn opengl in c++ and VisualStudio but i always had an erorand i am dont know why.
    Thanks in advance.
    The errors:

    Unhandled exception on 0x75ACA6F2 in GotGamesEngine.exe: Microsoft C++ exception: int on location 0x008FF2CC.
    (translated)
    (Picture 1)

    and sometimes something like this appears:

    Unhandled exception on 0x75ACA6F2 in GotGamesEngine.exe: Microsoft C++ exception: int on location 0x008CF2D8.
    (translated)
    (Picture 2)

    (Here are the Pictures!)
    1: https://i.stack.imgur.com/yNN7r.png
    2: https://i.stack.imgur.com/BsgQp.png
    3: https://i.stack.imgur.com/1YYoa.png
    4: https://i.stack.imgur.com/5d3qo.png

    Code:

    //main.cpp
    #include <iostream>
    #include <glad/glad.h>
    #include <GLFW/glfw3.h>
    
    #include "shaderClass.h"
    #include "VAO.h"
    #include "VBO.h"
    #include "EBO.h"
    
    /// Tag1
    
    GLfloat vertecies[] =
    {
        -0.5f, -0.5f * float(sqrt(3)) / 3, 0.0f,    //Lower left corner
        0.5f, -0.5f * float(sqrt(3)) / 3, 0.0f,     //Lower rigth corner
        0.0f, 0.5f * float(sqrt(3)) * 2 / 3, 0.0f,  //Upper COrner
        -0.5f / 2, 0.5f * float(sqrt(3)) / 6, 0.0f, //Inner left
        0.5f / 2, 0.5f * float(sqrt(3)) / 6, 0.0f,  //Inner rigth
        0.0f, -0.5f * float(sqrt(3)) / 3, 0.0f,     //Inner down
    
    };
    
    GLuint indices[] =
    {
        0, 3, 5,    //LOwer left triangle
        3, 2, 4,    //Lower rigth triangle
        5, 4, 1     //Upper triangle
    };
    
    int main()
    {
        glfwInit();
    
    
        glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
        glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
        glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    
    
        GLFWwindow* window = glfwCreateWindow(800, 800, "Name", NULL, NULL);
        if (window == NULL)
        {
            std::cout << "Failed to create Window!" << std::endl;
            glfwTerminate();
            return -1;
        }
        glfwMakeContextCurrent(window);
    
        gladLoadGL();
    
        glViewport(0, 0, 800, 800);
            
        Shader shaderProgram("default.vert", "default.frag");
        
        VAO VAO1;
        VAO1.Bind();
    
        VBO VBO1(vertecies, sizeof(vertecies));
        EBO EBO1(indices, sizeof(indices));
    
        VAO1.LinkVBO(VBO1, 0);
        VAO1.Unbind();
        VBO1.Unbind();
        EBO1.Unbind();
    
        while (!glfwWindowShouldClose(window))
        {
            glClearColor(0.07f, 0.13f, 0.17f, 1.0f);
            glClear(GL_COLOR_BUFFER_BIT);
            shaderProgram.Activate();
            VAO1.Bind();
            glDrawElements(GL_TRIANGLES, 9, GL_UNSIGNED_INT, 0);
            glfwSwapBuffers(window);
    
            glfwPollEvents();
        }
    
        VAO1.Delete();
        VBO1.Delete();
        EBO1.Delete();
        shaderProgram.Delete();
        glfwDestroyWindow(window);
        glfwTerminate();
        return 0;
    }
    
    //ShaderClass.cpp
    #include "shaderClass.h"
    
    std::string get_file_contents(const char* filename)
    {
        std::ifstream in(filename, std::ios::binary);
        if (in)
        {
            std::string contents;
            in.seekg(0, std::ios::end);
            contents.resize(in.tellg());
            in.seekg(0, std::ios::beg);
            in.read(&contents[0], contents.size());
            in.close();
            return(contents);
        }
        throw(errno);
    }
    
    Shader::Shader(const char* vertexFile, const char* fragmentFile)
    {
        std::string vertexCode = get_file_contents(vertexFile);
        std::string fragmentCode = get_file_contents(fragmentFile);
    
        const char* vertexSource = vertexCode.c_str();
        const char* fragmentSource = fragmentCode.c_str();
    
        GLuint vertexSahder = glCreateShader(GL_VERTEX_SHADER);
        glShaderSource(vertexSahder, 1, &vertexSource, NULL);
        glCompileShader(vertexSahder);
    
        GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
        glShaderSource(fragmentShader, 1, &fragmentSource, NULL);
        glCompileShader(fragmentShader);
    
        ID = glCreateProgram();
        glAttachShader(ID, vertexSahder);
        glAttachShader(ID, fragmentShader);
        glLinkProgram(ID);
    
        glDeleteShader(vertexSahder);
        glDeleteShader(fragmentShader);
    }
    
    void Shader::Activate()
    {
        glUseProgram(ID);
    }
    
    void Shader::Delete()
    {
        glDeleteProgram(ID);
    }
    //ShaderClass.h
    
    #ifndef SHADER_CLASS_H
    #define SHADER_CLASS_H
    
    #include <glad/glad.h>
    #include <string>
    #include <fstream>
    #include<sstream>
    #include <iostream>
    #include <cerrno>
    
    std::string get_file_contents(const char* filename);
    
    class Shader
    {
        public:
            GLuint ID;
            Shader(const char* vertexFile, const char* fragmentFile);
    
            void Activate();
            void Delete();
    };
    
    #endif
    
    //EBO.cpp
    #include "EBO.h"
    
    EBO::EBO(GLuint* indices, GLsizeiptr size)
    {
        glGenBuffers(1, &ID);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ID);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, indices, GL_STATIC_DRAW);
    }
    
    void EBO::Bind()
    {
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ID);
    }
    
    void EBO::Unbind()
    {
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    }
    
    void EBO::Delete()
    {
        glDeleteBuffers(1, &ID);
    }
    
    EBO.h
    #ifndef EBO_CLASS_H
    #define EBO_CLASS_H
    
    #include <glad/glad.h>
    
    class EBO
    {
    public:
        GLuint ID;
        EBO(GLuint* indices, GLsizeiptr size);
    
        void Bind();
        void Unbind();
        void Delete();
    };
    
    #endif
    
    //VAO.cpp
    #include "VAO.h"
    
    VAO::VAO()
    {
        glGenVertexArrays(1, &ID);
    }
    
    void VAO::LinkVBO(VBO VBO, GLuint layout)
    {
        VBO.Bind();
        glVertexAttribPointer(layout, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
        glEnableVertexAttribArray(layout);
        VBO.Unbind();
    }
    
    void VAO::Bind()
    {
        glBindVertexArray(ID);
    }
    
    void VAO::Unbind()
    {
        glBindVertexArray(0);
    }
    
    void VAO::Delete()
    {
        glDeleteVertexArrays(1, &ID);
    }
    
    //VAO.h
    #ifndef VAO_CLASS_H
    #define VAO_CLASS_H
    
    #include <glad/glad.h>
    #include "VBO.h"
    
    class VAO
    {
        public:
            GLuint ID;
            VAO();
    
            void LinkVBO(VBO VBO, GLuint layout);
            void Bind();
            void Unbind();
            void Delete();
    };
    
    #endif
    
    //VBO.cpp
    #include "VBO.h"
    
    VBO::VBO(GLfloat * vertecies, GLsizeiptr size)
    {
    
    


  • Benutze den Debugger, um die Zeile zu finden, in der die Exception geworfen wird.
    Kann es sein, daß throw(errno) die Exception auslösende Zeile ist (denn dort steht ja "Ausnahme: int bei ...")? Setze einfach mal einen Haltepunkt in diese Zeile.

    Exceptions sollten (möglichst) immer als std::exception (bzw. deren abgeleitete Exception-Klassen) geworfen werden. Und du solltest diese dann (spätestens) in deiner main-Funktion fangen und vernünftig behandeln (z.B. mittels cerr ausgeben).

    Es kann also filename nicht geöffnet werden (bei Angabe eines relativen Pfades muß die Datei relativ zum Zielordner (z.B. "debug") vorhanden sein - am besten per Postbuild-Script kopieren).



  • @FyMa2618 Ich kann mir nicht ganz zusammenreimen warum Du offensichtlich eine deutschsprachige Version von Visual Studio nutzt und hier auf Englisch postest. Versteh mich nicht falsch, ich hab' damit kein Problem, aber man weiß halt nicht wie man Dir antworten soll.

    I don't get why you're obviously using a german-language version of Visual Studio but post here in English. Don't get me wrong, that's no problem at all, but folk doesn't know whether to respond in German or in English. Please clarify.



  • @Swordfish Tut mir leid, ich bin neu auf diesen Forum und ich wusste nicht ob man in diesem Forum auch Deutsch schreiben darf.



  • @FyMa2618 sagte in C++ Glfw and glad shader error what to do?:

    @Swordfish Tut mir leid, ich bin neu auf diesen Forum und ich wusste nicht ob man in diesem Forum auch Deutsch schreiben darf.

    Du hast in das Unterforum C++ (alle ISO-Standards) gepostet. Mag sein dass alle ISO-Standards auch in anderen Sprachen als nur Deutsch funktioniert, aber im Englischen ganz sicher nicht.



  • @FyMa2618, haben dir denn meine Hinweise geholfen?



  • @FyMa2618 sagte in C++ Glfw and glad shader error what to do?:

    @Swordfish Tut mir leid, ich bin neu auf diesen Forum und ich wusste nicht ob man in diesem Forum auch Deutsch schreiben darf.

    Vielleicht hättest Du mal ein, zwei Beiträge lesen sollen ...



  • @Th69 Guten tag,
    danke für ihre Antwort, ja das problem lingt manchaml in der zeile throw error wie auf dem Bild zu sehen.
    Ich habe versucht einen Beobachtungspunkt zu setzten nun kam kein error allerdings kontte ich auf dem Fenster nichts machen und es erschien nichts in der überwachung standt allerdings auch nichts.
    Entschuldigen Sie die vielen Fragen, allerdings habe ich ihre anderen beschriebenen schritte nicht ganz verstanden.



  • Dann solltest du dich zuerst mit den Grundlagen der Entwicklung beschäftigen, s.a. Navigieren durch Code mit dem Visual Studio-Debugger.

    Die throw(errno)-Anweisung wird ausgeführt, weil die Datei mit Namen filename (d.h. eine oder beide der Shader-Dateien "default.vert", "default.frag") nicht geöffnet werden kann.

    Mit PostBuild-Script meine ich Festlegen von benutzerdefinierten Buildereignissen in Visual Studio.

    Du kannst aber auch ersteinmal (zum Test) die beiden Dateien in das Zielverzeichnis (d.h. dort wo deine EXE-Datei liegt) manuell hinkopieren.



  • @Th69 sagte in C++ Glfw and glad shader error what to do?:

    Du kannst aber auch ersteinmal (zum Test) die beiden Dateien in das Zielverzeichnis (d.h. dort wo deine EXE-Datei liegt) manuell hinkopieren.

    Ich bilde mir ganz fest ein daß das Working Directory beim Ausführen aus VS heraus das Verzeichnis ist in dem das Projekt liegt.



  • Nein.



  • @Th69 sagte in C++ Glfw and glad shader error what to do?:

    Nein.

    Neues Projekt in Visual Studio 2019 (Version 16.9.4)

    #include <stdexcept>
    #include <iostream>
    #include <string>
    
    #include <windows.h>
    
    std::wstring get_cwd()
    {
        auto required_size{ GetCurrentDirectoryW(0, nullptr) };
    
        if (!required_size)
            throw std::runtime_error{ "GetCurrentDirectoryW()" };
        
        std::wstring cwd;
        cwd.resize(required_size + 1);
        
        if (!GetCurrentDirectoryW(required_size + 1, &cwd[0]))
            throw std::runtime_error{ "GetCurrentDirectoryW()" };
    
        return cwd;
    }
    
    std::wstring get_module_filename(HMODULE module_handle)
    {
        std::wstring module_filename;
        module_filename.resize(MAX_PATH + 1);
    
        // error checking not WinXP-safe
        if (!GetModuleFileNameW(module_handle, &module_filename[0], module_filename.size()) || GetLastError() == ERROR_INSUFFICIENT_BUFFER)
            throw std::runtime_error{ "GetModuleFileNameW()" };
    
        return module_filename;
    }
    
    int main()
    {
        std::wcout << get_cwd() << '\n'
                   << get_module_filename(nullptr) << "\n\n";
    }
    
    

    Aus VS heraus gestartet ([Crtl] + [F5]):

    C:\Users\Swordfish\source\repos\Project1
    C:\Users\Swordfish\source\repos\Project1\Debug\Project1.exe
    
    
    C:\Users\Swordfish\source\repos\Project1\Debug\Project1.exe (process 18612) exited with code 0.
    

    So. Du darfst wieder.



  • OK, gebe mich geschlagen. 😞

    Bei C# ist es aber definitiv das Verzeichnis, in dem die EXE liegt (womit ich hauptsächlich noch entwickle).
    Ich erinnere mich aber, daß ich früher bei C++ Projekten das WorkingDir in den Debug-Optionen gesetzt hatte (wahrscheinlich deswegen). Habe dazu How to change working directory in Visual Studio gefunden.

    Das kann (leider) dazu führen, daß man beim Release eines Projektes einige Dateien vergißt zu "deployen", obwohl das Projekt aus VS heraus dann funktioniert.



  • @Th69 Ja, Sorry, war ein wenig patzig weil Du nur "Nein." hingeklatscht hast. Alles Gut.


Log in to reply