我使用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才能成功。 在代码中它崩溃了吗?调试器告诉你什么? –