无法初始化OpenGL

Chr*_*ris 2 c++ opengl sdl sdl-2

我有点麻烦让我的灵魂去工作.当我初始化glew时,我收到一个错误:缺少GL版本.我也无法创建上下文: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;
}
Run Code Online (Sandbox Code Playgroud)

这些是我使用的链接器设置(按此顺序):glew32.lib,glu32.lib,opengl32.lib,SDL2.lib,SDL2main.lib.

我确信正确包含了库.PS:这是我的第一篇文章,如果我遗漏了一些信息告诉我!

Hol*_*Cat 5

你错过了SDL_WINDOW_OPENGL国旗SDL_CreateWindow().

此外,您必须删除#undef main.否则你需要自己做一些低级初始化,而你不需要做.

另一件事:你必须从核心profile(SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY);)切换到兼容性配置文件,因为当你要求它在Windows上初始化核心配置文件上下文时,GLEW有崩溃的倾向.

此外,核心的许多部分都是多余的:

  • SDL_WINDOW_SHOWN - 它已被默认使用.
  • SDL_GL_MakeCurrent(window, context); - 只有一个上下文时不需要.
  • glViewport(0, 0, 800, 600); - 创建上下文时,它会自动为您设置正确的视口.
  • SDL_Quit();- 程序结束时不需要调用任何东西.它什么都不做,但会让你的程序变慢.(至少这是它在Windows上的工作方式.在Linux上,它有时是必要的,正如@keltar指出的那样.另外,它可以防止像valgring这样的泄漏检测器对你大肆宣传SDL内部结构.)
  • #include <SDL2\SDL_opengl.h>- 这是一个替代品<GL/gl.h>,你不需要它,因为你已经拥有<GL\glew.h>.