SDL2 Opengl遇到的坑

新手使用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默认的渲染函数有冲突。

后面懒得写了,待续

猜你喜欢

转载自blog.csdn.net/u012863565/article/details/125967574