C++ 可靠地创建OpenGL上下文?

C++ 可靠地创建OpenGL上下文?,c++,opengl,sdl,opengl-3,C++,Opengl,Sdl,Opengl 3,摘要: 在开发计算机上成功创建了OpenGL上下文,但在尝试分发应用程序时,屏幕仅显示黑色。发布OpenGL应用程序时需要考虑哪些问题 详细信息: 我正在使用SDL2创建OpenGL3.1上下文。上下文必须至少为3.1才能工作 我还没有彻底测试这个问题,所以我没有使用中的图形卡等信息。然而,我更感兴趣的是摘要中提出的一般性问题,即在发布OpenGL应用程序时需要考虑什么 下面是上下文创建代码 // CREATE SDL U32 flags; flags |= SDL_I

摘要:

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

详细信息:

我正在使用SDL2创建OpenGL3.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();
  • 确保您知道您的应用程序依赖于什么,并从平台上请求它。在我的经验中,说“核心档案”意义不大。最好查询您的应用程序需要的每个扩展,并在缺少某些内容时关闭应用程序(在用户眼中是优雅而友好的)。扩展并不是一切。检查所有缓冲区的最大大小。我有真实的生活经历
  • 永远不要依赖标准遵从性。是的,标准上说GL_深度是初始禁用的。不,你决不能相信司机遵守了这条规则。是的,这是一个真实的生活场景
  • 在各种硬件上运行适当的测试。供应商以不同的方式实现驱动程序。有些人可能会认为负顶点指数是完美的。有些可能不会。那里也有真实的生活经历
  • 永远不要接受无提示的OpenGL错误。“出现问题,可能没什么可担心的。对于这个硬件。对于这个驱动程序。对于这个版本。对于这个操作系统。可能。”
  • 算算。浮点精度在OpenGL标准中并没有那么严格(在OpenGL中更为严格),对于具有未定义行为的操作(如零除或任何基于NaN的操作),您永远不希望依赖这些行为
  • 阅读标准。是的,这是一种痛苦,但相信我,它会得到回报的。你当然不会感觉到,因为你永远不会遇到你永远不会遇到的问题

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

    为什么你只在Windows上运行
    glewInit
    ?上校:在没有glew的情况下,它似乎在Mac上运行。为什么你要在当前GL上下文之前尝试
    SDL\u GL\u SetSwapInterval()
    ?或者甚至是一个窗口?在验证
    mainWindow
    是否非空之前,您还试图
    SDL\u GetWindowSize()
    。是否
    CHECK()
    调用
    SDL\u GetError()