2016-06-19 4 views
2

glew가 작동하는 데 약간의 문제가 있습니다. glew를 초기화 할 때 오류가 발생합니다 : 누락 된 GL 버전. 나는 컨텍스트도 만들 수 없다 : OpenGL이 초기화되지 않았다. 이 내 코드입니다 :OpenGL을 초기화 할 수 없습니다.

#include <GL\glew.h> 
#include <GL\GLU.h> 
#include <SDL2\SDL.h> 
#include <SDL2\SDL_opengl.h> 

#include <iostream> 
#undef main 

SDL_GLContext context; 
SDL_Renderer * renderer; 
SDL_Window * window; 

int main(int argc, char *argv[]) { 
    //init SDL 
    if (SDL_Init(SDL_INIT_EVERYTHING) != 0) { 
     fprintf(stderr, "\n> Unable to initialize SDL: %s\n", SDL_GetError()); 
    } 

    window = SDL_CreateWindow("Cri Engine 3D", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 800, 600, SDL_WINDOW_SHOWN); 
    if (window == nullptr) 
    { 
     printf("> Window could not be created! SDL Error: %s\n", SDL_GetError()); 
    } 

    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); 
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); 
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); 

    context = SDL_GL_CreateContext(window); 
    SDL_GL_MakeCurrent(window, context); 


    if (context == NULL) { 
     printf("> OpenGL context could not be created! SDL Error: %s\n", SDL_GetError()); 
    } 

    //Glew 
    glewExperimental = GL_TRUE; 
    GLenum err = glewInit(); 
    if (GLEW_OK != err) { 
     fprintf(stderr, "> Error: %s\n", glewGetErrorString(err)); 
    } 
    fprintf(stdout, "> Using GLEW %s\n", glewGetString(GLEW_VERSION)); 

    glViewport(0, 0, 800, 600); 

    SDL_Quit(); 
    return 0; 
} 

이 내가 (이 순서대로)를 사용하여 링커 설정은 다음과 같습니다 glew32.lib, glu32.lib, opengl32.lib, SDL2.lib, SDL2main.lib.

라이브러리가 올바르게 포함되어 있습니다. 추신 : 내 첫 번째 게시물, 일부 정보를 놓치고있다면 말해줘!

답변

5

SDL_CreateWindow()에 대한 SDL_WINDOW_OPENGL 플래그가 없습니다.

또한 이어야하며 #undef main을 제거해야합니다. 그렇지 않으면 자신이하지 않는 저수준 초기화를 직접 수행해야합니다.

다른 점 : GLEW가 Windows에서 핵심 프로필 컨텍스트를 초기화하도록 요청할 때 충돌하는 경향이 있으므로 코어 프로필 (SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY);)의 호환성 프로필로 전환해야합니다.

또한, 핵심의 많은 부분이 중복 :

  • SDL_WINDOW_SHOWN - 그것은 이미 기본적으로 사용됩니다.
  • SDL_GL_MakeCurrent(window, context); - 컨텍스트가 하나 뿐인 경우 필요하지 않습니다.
  • glViewport(0, 0, 800, 600); - 컨텍스트를 만들면 올바른 뷰포트가 자동으로 설정됩니다.
  • SDL_Quit(); - 프로그램이 종료되면 번으로 전화 할 필요가 없습니다. 아무것도하지 않고 프로그램을 더 느리게 닫습니다. (적어도 이것은 Windows에서 작동하는 방식입니다. 리눅스에서는 @keltar가 지적했듯이 때로는 필요합니다. 또한 valgring과 같은 누설 감지기가 SDL 내부 구조에 대해 당신에게 외치는 것을 방지합니다.)
  • #include <SDL2\SDL_opengl.h> - It 's a <GL/gl.h>을 대체합니다. 이미 가지고 있기 때문에 필요하지 않습니다. <GL\glew.h>입니다.
+0

정말 고마워요, 일하기까지 너무 오래 노력했습니다. SDL_CreateWindow()에 플래그를 추가하면 트릭을 수행합니다. 나는 코드가 지저분하다는 것을 안다. (나는 오랫동안 그 코드를 어지럽 혔기 때문에). – Chris

+0

'SDL_Quit' 부분은 꽤 논쟁의 여지가 있습니다 (예 : valgrind). 'SDL_opengl.h'는 잘못되었습니다. 결코 포함되지 않습니다; 그것은 gl.h의 대체물이다. – keltar

+0

@keltar 좋은 점, 나는 대답을 편집했습니다. – HolyBlackCat

1

창 생성 플래그에 SDL_WINDOW_OPENGL을 추가하십시오.

관련 문제