我使用SDL2和C++ 11來構建遊戲引擎(就像一個個人項目,爲了好玩和練習),我想要做的事情之一是嘗試並讓圖形驅動程序使用最新支持的OpenGL版本,並根據版本改變引擎圖形部分的渲染方式。通過這種方式,我可以使用OpenGL的最新功能,它們相關且有用,但也支持較舊的硬件。有兩種方法我能想到的:創建一個OpenGL 4.3上下文崩潰GLX
檢測的OpenGL支持的最新版本,並使用,但我想不出任何辦法做到這一點。是的,我試過谷歌。
使用反覆試驗,從最新版本開始(4.3,但我的GTX 460最多隻支持4.2,即使我更新了驅動程序),如果失敗了(我通過檢查SDL返回一個NULL上下文),我降低版本號並重試。
創建4.3上下文後,我使用的方法(#2)立即失敗。我知道我的圖形驅動程序現在只支持4.2,但我一直認爲GLX的設計目的是拋出一個錯誤,給出一個NULL上下文,讓程序繼續前進,但是它不能超越上下文的失敗創建。我對GLX如何表現錯誤的假設?有沒有辦法在不創建上下文的情況下檢測最新的受支持版本?
因爲我知道有些人喜歡看演示錯誤完整的和最小的來源,那就是:
#include <SDL2/SDL.h>
#include <SDL2/SDL_opengl.h>
int main() {
if(SDL_Init(SDL_INIT_EVERYTHING) < 0) {
return -1;
}
SDL_Window* window = SDL_CreateWindow("SDL Window", 0, 0, 800, 600, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
if(window == nullptr) {
return -1;
}
unsigned int major = 4;
unsigned int minor = 3;
SDL_GLContext context = nullptr;
while(context == nullptr) {
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, major);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, minor);
context = SDL_GL_CreateContext(window);
if(context == nullptr) {
if(minor == 0 && major > 1) {
--major;
minor = 9;
}
else if(minor > 0) {
--minor;
}
else {
SDL_DestroyWindow(window);
return -1;
}
}
}
SDL_Delay(5000);
SDL_GL_DeleteContext(context);
SDL_DestroyWindow(window);
return 0;
}
另外,如果我改變代碼,開始了4.2情境,而不是4.3,它工作得很好。所以錯誤在於創建一個4.3上下文。
不確定是否會有所幫助,但此問題指出在調用SDL_Init之前必須設置上下文版本:http://stackoverflow.com/questions/8110053/creating-an-opengl-3-2- 3-x-context-in-sdl-1-3 –
Vaughn,真的嗎?很奇怪,SDL文檔暗示它必須在調用SDL Init之後並在創建上下文之前設置。另外,如果我將代碼更改爲從4.2開始,它工作得很好。大概應該提到... – OniLink
你有沒有試過@VaughnCato提供的建議?你是否檢查過'SDL_GL_SetAttribute'的返回值,文檔建議它們應該爲0才能成功。 在代碼中它崩潰了嗎?調試器告訴你什麼? –