新手使用SDL2的时候创建了SDL_Renderer渲染器
默认SDL2 Renderer好像是使用的D3D(不敢肯定)
相对应的显示函数是SDL_RenderPresent()
那么我们opengl对应的显示函数是SDL_GL_SwapWindow()
经过测试,以上这俩函数都能正常显示,但不能一起用,否则会闪烁
坑1:SDL_RenderClear函数的使用
用SDL默认的渲染器时调用清除函数没问题
使用opengl以后调用这个会把画面清除掉,小心使用
如何在SDL2中使用opengl
首先进行初始化
// 设置 SQL 版本和信息
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
然后在你的SDL_CreateWindow函数里面加入SDL_WINDOW_OPENGL,如下
window = SDL_CreateWindow(p_title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, p_w, p_h, SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
然后创建opengl上下文,并初始化glad
SDL_GL_CreateContext(window);
SDL_GL_SetSwapInterval(0);
SDL_SetHint(SDL_HINT_RENDER_DRIVER, "opengl");
gladLoadGLLoader((GLADloadproc)SDL_GL_GetProcAddress);
在你的创建渲染器的地方检查一下,你的渲染器是否支持opengl
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
//检查是否支持OPENGL,如不支持退出,退出码 8
SDL_RendererInfo rendererInfo;
SDL_GetRendererInfo(renderer, &rendererInfo);
if (strncmp(rendererInfo.name, "opengl", 6)) std::cout << "88888" << std::endl;;
这样初始化的工作就做好了
解释一下,以上步骤是让渲染器支持opengl
我的初衷是想之前写的SDL_Renderer渲染UI的部分不被干扰,同时引进opengl,还好这两种可以同时工作,省去了重新写的麻烦。
坑2 glad与SDL_opengl
由于我也是初学,讲的可能不对,大家批判学习
glad这个第三方库可以帮助我们找到opengl的函数
SDL_opengl里面是sdl自带的opengl的函数,需要在链接器里加入opengl32否则编译报错
目前测试的结果是SDL_opengl里面的函数能与sdl很好的结合,glad的话也能用但是跟sdl默认的渲染函数有冲突。
后面懒得写了,待续