簡體   English   中英

可靠地創建 OpenGL 上下文?

[英]Reliably creating an OpenGL context?

概括:

在開發計算機上成功創建了 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. 閱讀標准。 是的,這是一種痛苦,但相信我,它會得到回報。 你當然不會感覺到它,因為你永遠不會遇到你永遠不會遇到的問題。

作為旁注,沒有人真正遵循這種做法。 每個人都先編碼,然后永遠調試。

暫無
暫無

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

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