2017-02-23 5 views
1

GLFW와 GLEW를 사용하여 C++을 통해 게임을하고 있습니다. GLEW를 구현할 때까지 모든 것이 잘 진행되었지만 이전에 결코 경험하지 못했던 오류가 발생했습니다. 무엇을 해야할지, 나는 그것을 봤고 약간의 연구를했지만 아무 소용이 없습니다. 나는 스택 프레임 섹션에서 내 MAIN.CPPGLEW _First가 nullptr이었습니다

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

에 코드 줄 함께 할 수있는 뭔가 또한 메모리 함께 할 수있는 뭔가가 말한다 말한다 것으로 나타났습니다. 나는 아래로 아래에있는 내 코드의 나머지 부분을 떠날거야 어떤 정보가 있다면 그냥 물어 필요하고 난 다음을

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

을 꺼내 경우가

그래서 난 그냥 발견 제공하기 위해 최선을 다할 것입니다 그러나 창은 생성되지 않습니다.

여기에서 나는 어디로 가나 요? 아이디어가 있으십니까?

#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

Window.cpp에서
#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

전체 오류 란 무엇입니까? 그리고 디버그 호출 스택 또는 다른 정보가 있습니까? – ssell

+0

내가 볼 수있는 유일한 오류는 예외 발생 : 읽기 액세스 위반입니다. _First는 nullptr입니다. –

+0

'glGetString'이 참으로 부서지면 OpenGL이 제대로 초기화되지 않았기 때문입니다. 'Window :: init' 중에 오류 출력을 얻고 있습니까? 이것은 또한'glGetString'에 대한 호출을 제거 할 때 충돌이 일어나지 않지만 어떤 창이 열리지 않는다는 사실에 의해 지원됩니다. 또한 "왜 [glGetString (GL_VERSION)이 Seg 오류를 일으킬 수 있습니까?] (http://stackoverflow.com/questions/6288759/why-could-glgetstringgl-version-be-causing-a-seg-fault)" – ssell

답변

1

:

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

glewInit()은 변수가 아니라 함수입니다. 그것을 함수로 호출해야합니다. 나는 심지어 이것이 컴파일 된 것에 놀랐다.

glewInit()이 제대로 호출되지 않은 경우 버전 1.1 이후의 다른 OpenGL 함수는 모두 ACCESS_VIOLATION READING ADDRESS 0x00000000 또는 유사한 오류를 발생 시키므로 GLEW에서 제공하는 함수 매크로 중 유효한 함수 포인터를 가리 키지 않습니다.

+0

'나는 이것이 컴파일 된 것을보고 놀랐습니다. '이것이 질문에 코드를 복사하는 데있어서의 실수가 아니라면 나는 그렇습니다. 그러나 좋은 포수, 나는 그럭저럭 그것을 여러 번 지나서 바로 볼 수 있었다. – ssell

+0

@ssell 필자는 이전에 GLEW 사용을 중단했는데 (glBinding으로 전환됨) GLEW가 포인터를 기능하도록 모든 것이 쇠퇴하게 만들거나'gl *'기능 만 수행 하는지를 기억할 수 없습니다. 그것은 모든 것을 위해 그것을한다면, 그것은 적어도 프로그램이 컴파일되는 이유를 설명 할 것입니다 (그러나 정확하게 실행되지는 않습니다). – Xirema

+0

GLEW를 사용하지 않는 것이 좋습니다. –