2017-02-23 6 views
1

So habe ich auf ein Spiel durch C gearbeitet ++ mit GLFW und GLEW und alles lief gut, bis ich GLEW implementiert dann bekomme ich einen Fehler, ich habe noch nie zuvor begegnet und ich habe nicht die leiseste auf was zu tun ist, habe ich es gegoogelt und einige Nachforschungen gemacht, aber ohne Erfolg. Ich habe in dem Stack-Frame Abschnitt sagt es etwas zu tun mit dieser Codezeile in meinem main.cppGLEW _First war nullptr

std::cout << glGetString(GL_VERSION) << std::endl; 

auch sagt, dass es etwas mit Erinnerung zu tun bemerkt. Ich werde den Rest meines Codes verlassen unten und wenn es eine Info brauchen Sie nur fragen, und ich werde mein Bestes versuchen, es entdeckte ich nur

So zu bieten, wenn i

nehmen
std::cout << glGetString(GL_VERSION) << std::endl; 

es dann funktioniert aber das Fenster wird nicht erstellt.

Wohin gehe ich von hier? Irgendeine Idee?

#include "src\graphics\window.h" 
int main() { 
    using namespace benji; 
    using namespace graphics; 

    Window window("Benji Engine", 1280, 720); 
    glClearColor(0.2f, 0.3f, 0.8f, 1.0f); 
    std::cout << glGetString(GL_VERSION) << std::endl;`` 

    while (!window.closed()) { 
     std::cout << window.getWidth() << ", " << window.getHeight() << std::endl; 
     window.clear(); 
     glBegin(GL_TRIANGLES); 
     glVertex2f(-0.5f, -0.5f); 
     glVertex2f(0.0f, 0.5f); 
     glVertex2f(0.5f, -0.5f); 
     glEnd(); 
     window.update(); 
    } 

    return 0; 
} 

main.h

#pragma once 
    class main 
    { 
    public: 
     main(); 
     ~main(); 
    }; 

window.cpp

#include "window.h" 

namespace benji { namespace graphics { 


void windowResize(GLFWwindow *window, int width, int height); 

Window::Window(const char *title, int width, int height) { 
    m_Title = title; 
    m_Width = width; 
    m_Height = height; 
    if (!init()) { 
     glfwTerminate(); 
    } 

} 

Window::~Window() { 
    glfwTerminate(); 

} 

bool Window::init() { 
    if (!glfwInit()) { 
     std::cout << "Failed to initialize GLFW!" << std::endl; 
     return false; 
    } 

    m_Window = glfwCreateWindow(m_Width, m_Height, m_Title, NULL, NULL); 
    if (!m_Window) { 
     std::cout << "Failed to create GLFW window!" << std::endl; 
     return false; 
    } 
    glfwMakeContextCurrent(m_Window); 
    glfwSetWindowSizeCallback(m_Window, windowResize); 

    if (glewInit != GLEW_OK) { 
     std::cout << "GLEW FAILED!" << std::endl; 
     return false; 
    } 
    return true; 


} 

void Window::clear() const { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
} 

void Window::update(){ 
    glfwPollEvents(); 
    glfwSwapBuffers(m_Window); 


} 

    bool Window::closed() const { 
    return glfwWindowShouldClose(m_Window) == 1; 
} 

    void windowResize(GLFWwindow *window, int width, int height) { 
     glViewport(0, 0, width, height); 
    } 
}} 

window.h

#pragma once 
    #include <iostream> 
    #include <GL\glew.h> 
    #include <GLFW\glfw3.h> 

namespace benji { 
    namespace graphics { 
     class Window { 
     private: 
      const char *m_Title; 
      int m_Width, m_Height; 
      GLFWwindow *m_Window; 
      bool m_Closed; 

     public: 
      Window(const char *title, int width, int height); 
      ~Window(); 
      bool closed() const; 
      void update(); 
      void clear() const; 

      int getWidth() const { 
       return m_Width; 

      } 
      int getHeight() const { return m_Height; } 
     private: 
      bool init(); 

     }; 
} 

} 
+2

Was ist der volle Fehler? Und haben Sie einen Debug-Callstack oder andere Informationen? – ssell

+0

Der einzige andere Fehler, den ich sehen kann, ist Exception geworfen: Lesezugriffsverletzung. _First war nullptr. –

+0

Wenn 'glGetString' tatsächlich abstürzt, liegt das daran, dass Ihr OpenGL nicht richtig initialisiert wurde. Erhalten Sie irgendwelche Fehlermeldungen während Ihrer 'Window :: init'? Dies wird auch durch die Tatsache unterstützt, dass wenn Sie den Aufruf von 'glGetString' entfernen, es nicht abstürzt, aber kein Fenster geöffnet wird. Siehe auch "[Warum konnte glGetString (GL_VERSION) einen Seg Fehler verursachen?] (Http://stackoverflow.com/questions/6288759/why-could-glgetstringgl-version-be-causing-a-seg-fault)" – ssell

Antwort

1

In Window.cpp:

if (glewInit != GLEW_OK) { 
    std::cout << "GLEW FAILED!" << std::endl; 
    return false; 
} 

glewInit() ist eine Funktion, keine Variable. Sie müssen es als eine Funktion bezeichnen. Ich bin überrascht, dass dies sogar kompiliert wurde.

Alle anderen OpenGL-Funktionen, die aus der Zeit nach Version kommen 1.1 werden Fehler auf die Wirkung von ACCESS_VIOLATION READING ADDRESS 0x00000000 oder einem ähnlichen Fehler werfen, denn wenn glewInit() nicht richtig genannt wird, keine der Funktionsmakros durch GLEW zur Verfügung gestellt, um gültige Funktionszeiger verweisen.

+0

'Ich bin überrascht, dass dies sogar kompiliert wurde, also bin ich, wenn das nicht nur ein Fehler beim Kopieren des Codes auf die Frage war. Aber guter Fang, ich schaffte es mehrmals gleich vorbei zu schauen. – ssell

+0

@ssell Ich habe vor einiger Zeit auf GLEW verzichtet (auf glBinding umgestellt) und kann mich nicht mehr erinnern, ob GLEW alles zu Funktionszeigern oder nur zu den 'gl *' Funktionen macht. Wenn es für alles funktioniert, würde das zumindest erklären, warum das Programm kompiliert (aber nicht korrekt läuft). – Xirema

+0

Würden Sie GLEW nicht empfehlen? –