簡體   English   中英

無法初始化OpenGL

[英]Can't initialize OpenGL

我有些麻煩,無法上班。 初始化時,出現錯誤:缺少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;
}

這些是我使用的鏈接器設置(按此順序):glew32.lib,glu32.lib,opengl32.lib,SDL2.lib,SDL2main.lib。

我確定正確包含了這些庫。 PS:這是我的第一篇文章,如果我缺少一些信息,請告訴我!

您缺少SDL_CreateWindow() SDL_WINDOW_OPENGL標志。

另外,您必須刪除#undef main 否則,您將需要自己進行一些低級初始化,而您不需要這樣做。

另一件事:必須從核心配置文件( SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY); )切換到兼容性配置文件SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY);因為當您要求GLEW在Windows上初始化核心配置文件上下文時,它會崩潰。

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

  • SDL_WINDOW_SHOWN默認情況下已使用。
  • SDL_GL_MakeCurrent(window, context); -只有一個上下文時不需要。
  • glViewport(0, 0, 800, 600); -創建上下文時,它將自動為您設置正確的視口。
  • SDL_Quit(); -程序結束時,您無需調用任何內容 它什么都不做,但是會使程序關閉速度變慢。 (至少這就是它在Windows上的工作方式。正如@keltar指出的那樣,在Linux上有時有時是必要的。此外,它還可以防止泄漏等泄漏檢測器對SDL內部結構大吼大叫。)
  • #include <SDL2\\SDL_opengl.h> -它代替了<GL/gl.h> ,您不需要它,因為您已經有了<GL\\glew.h>

嘗試將SDL_WINDOW_OPENGL添加到窗口創建標志中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM