可靠地创建OpenGL上下文

Reliably creating an OpenGL context?

本文关键字:OpenGL 上下文 创建      更新时间:2023-10-16

摘要:

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. 确保您知道您的应用程序依赖于什么,并向平台提出要求。根据我的经验,说"核心档案"意义不大。更好地查询应用程序所需的每一个扩展,如果缺少什么,请关闭应用程序(在用户眼中优雅而友好)。扩展并不是一切。还要检查所有缓冲区的最大大小。其中我有真实的生活经验
  2. 永远不要依赖标准合规性。是的,标准规定GL_DEPTH最初被禁用。不,你永远不能相信司机遵守了这条规则。是的,那是真实的生活场景
  3. 对各种硬件进行适当的测试。供应商实施驱动程序的方式不同。有些人可能认为负顶点索引是完全可以的。有些人可能不会。那里的真实生活体验
  4. 永远不要接受无提示的OpenGL错误。"出了问题,可能没什么好担心的。对于这个硬件。对于这个驱动程序。对于这个版本。对于这个操作系统。也许吧。"
  5. 计算一下。浮点精度在OpenGL标准中没有那么严格(在OpenGL中更严格),对于具有未定义行为的操作(如除以零或任何基于NaN的操作)的行为,您永远不想依赖
  6. 阅读标准。是的,这是一种痛苦,但相信我,它会有回报的。你当然不会感觉到,因为你永远不会遇到你永远不会有的问题

顺便说一句,没有人真正遵循这种做法。每个人都先编码,然后永远调试。