可靠地创建OpenGL上下文?

时间:2016-03-26 21:14:41

标签: c++ opengl sdl opengl-3

要点:

在开发计算机上成功创建了OpenGL上下文,但在尝试分发应用程序时,屏幕仅显示黑色。分发OpenGL应用程序时需要考虑哪些问题?

详细信息:

我正在使用SDL2来创建OpenGL 3.1上下文。工作环境必须至少为3.1。

我没有彻底测试过这个问题,因此我没有使用显卡等信息。但是,我对摘要中提出的关于分发OpenGL应用程序时需要考虑的内容的一般性问题更感兴趣。

这是上下文创建代码。

    // CREATE SDL
    U32 flags;

    flags |= SDL_INIT_VIDEO;
    flags |= SDL_INIT_EVENTS;

    if(!SDL_WasInit(0)) // Make sure SDL is initialized.
        SDL_Init(0);

    CHECK(!SDL_InitSubSystem(flags));

    // SET OPENGL ATTRIBUTES
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, config.glVersionMajor);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, config.glVersionMinor);
    if(config.glCoreProfile)
        SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
    else
        SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY);
    //SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, config.glDepthBuffer);
    SDL_GL_SetSwapInterval(0);

    // CREATE WINDOW
    flags = SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN;
    if(config.fullscreen)
        flags = flags | SDL_WINDOW_FULLSCREEN_DESKTOP;
    else if(config.maximized)
        flags = flags | SDL_WINDOW_MAXIMIZED;
    if(config.resizable)
        flags = flags | SDL_WINDOW_RESIZABLE;
    mainWindow = SDL_CreateWindow(config.programName, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
                                    config.windowWidth, config.windowHeight, flags);
    SDL_GetWindowSize(mainWindow, (int*)&windowWidth, (int*)&windowHeight);
    CHECK(mainWindow != NULL);

    // CREATE OPENGL CONTEXT
    mainContext = SDL_GL_CreateContext(mainWindow);
    CHECK(mainContext != NULL);

    // INIT GLEW
#ifdef _WIN32
    CHECK(GLEW_OK == glewInit());
#endif

    glEnable(GL_DEPTH_TEST);
    glViewport(0,0,windowWidth,windowHeight);

    glClearColor(0,0,0,1);
    //glEnable(GL_PRIMITIVE_RESTART);
    glEnable(GL_CULL_FACE);
    //glPrimitiveRestartIndex(0xFFFFFFFF);

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    TTF_Init();

1 个答案:

答案 0 :(得分:0)

  1. 确保您知道您的应用程序所依赖的内容,并从平台上请求它。说“核心资料”对我来说意义不大。如果缺少某些内容,请更好地查询应用程序所需的每个扩展,并关闭应用程序(优雅而友好地在用户眼中)。扩展并非一切。检查所有缓冲区的最大大小。其中我有真实的生活经历。
  2. 绝不依赖标准合规性。是的,该标准表示GL_DEPTH被初始禁用。不,你不会依赖于驱动程序符合该规则。是的,这是一个真实的生活场景。
  3. 对各种硬件运行正确的测试。供应商以不同方式实施驱动有些人可能认为负顶点指数非常好。有些人可能没有。那里的真实生活经历......
  4. 永远不要接受静默的OpenGL错误。 “出了点问题,可能无需担心。对于这个硬件。对于这个驱动程序。对于这个版本。对于这个操作系统。也许。”
  5. 算一算。 OpenGL标准(OpenGL中更严格)的浮点精度并不严格,具有未定义行为的操作(如除零或任何基于NaN的操作)的行为绝不是您想要依赖的。
  6. 阅读标准。是的,这是一种痛苦,但相信我会付出代价。你当然不会觉得这样,因为你永远不会遇到你永远不会遇到的问题。
  7. 作为旁注,没有人真正遵循这种做法。每个人都先编码,然后永远调试。