2016-06-19 30 views
2

私の仕事がうまくいくのにはいくつか問題があります。私はglewを初期化するときにエラーが発生します:GLバージョンがありません。コンテキストを作成することはできません。OpenGLは初期化されていません。 これは私のコードです:glew32.lib、glu32.lib、opengl32.lib、SDL2.lib、SDL2main.lib: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; 
} 

これらは私が(この順序で)使用リンカ設定されています。

私は、ライブラリが正しく含まれていると確信しています。 PS:これは私の最初の投稿です。

答えて

5

SDL_CreateWindow()のためのSDL_WINDOW_OPENGLフラグがありません。

また、で、#undef mainを削除する必要があります。 そうしないと、低レベルの初期化を自分で行う必要があります。

別のこと:コアプロファイル(SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY);)から互換性プロファイルに切り替える必要があります。これは、GLEWがWindows上でコアプロファイルコンテキストを初期化するときにクラッシュする傾向があるためです。

はまた、あなたのコアの多くの部分は冗長である:

  • SDL_WINDOW_SHOWN - それはデフォルトですでに使用されています。
  • SDL_GL_MakeCurrent(window, context); - コンテキストが1つだけの場合は不要です。
  • glViewport(0, 0, 800, 600); - コンテキストを作成すると、自動的に正しいビューポートが設定されます。
  • SDL_Quit(); - プログラム終了時にに電話する必要はありません。何もしませんが、あなたのプログラムは遅くなります。 (少なくとも、これはWindows上で動作する方法ですが、Linuxでは@keltarが指摘しているように、時には必要です。また、SDL内部構造についてのバグのような漏れ検出器があなたに叫ばないようにします。 <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を追加してみてください。

関連する問題