2016-03-26 19 views
-1

摘要:可靠地创建一个OpenGL上下文?

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

你为什么只在Windows上使用'glewInit'? –

+0

@Colonel好吧,它似乎无法在Mac上工作 –

+0

为什么在获取当前的GL上下文之前,您尝试使用'SDL_GL_SetSwapInterval()'?或者甚至是关于这个问题的窗口? – genpfault

回答

0
  1. 确保你知道你的应用是什么依赖,以及从平台所要求的。说“核心配置文件”意味着我的经验很少。更好地查询应用程序需要的每个扩展,并关闭应用程序(在用户眼中优雅而友善),如果缺少某些东西。扩展并不是一切。检查所有缓冲区的最大尺寸。其中我有真实的生活经验。
  2. 永远不要依赖标准合规性。是的,标准说明GL_DEPTH被禁用。不,你永远不要依靠司机遵守这一规则。是的,那是一种真实的生活场景。
  3. 在多种硬件上运行适当的测试。厂商实施不同的驱动程序。有些人可能认为消极的顶点指数非常好。有些人可能不会。真实生活中的体验以及...
  4. 永远不要接受无声的OpenGL错误。 “出了问题,可能没有什么可担心的,对于这个硬件,对于这个驱动,对于这个版本,对于这个操作系统,也许。”
  5. 做数学。浮点精度并没有被OpenGL标准所严格(在OpenGL中更严格),并且具有未定义行为的操作(例如零除或基于NaN的任何操作)的行为绝不是您想要依赖的东西。
  6. 阅读标准。是的,这是一种痛苦,但相信我会付出。你当然不会感觉到它,因为你永远不会遇到你永远不会遇到的问题。

作为一个方面说明,没有人真正遵循这种做法。大家先编码然后永远调试。