您当前的位置: 首页 > 

qianbo_insist

暂无认证

  • 4浏览

    0关注

    399博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

SDL2 使用高版本opengl

qianbo_insist 发布时间:2022-09-15 07:10:42 ,浏览量:4

sdl2

sdl本身是一个非常好的画图工具,无论二维和三维他都给我们创立了一个良好的基础,本身是可以使用directx和opengl来绘制的,如果要保证跨平台,暂时是可以使用opengl来做。 下面是class Window的示例代码,创建窗口时我们可以使用OPENGL标识

uint32_t flags = SDL_WINDOW_OPENGL;
m_window = SDL_CreateWindow("Engine!", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, mode.w, mode.h, flags);

剩下一定要使用SDL_GL_CONTEXT_PROFILE_MASK, 这样才能设置版本

  SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);

然后就可以在sdl opengl里面设置版本了

  SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
  SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 5);

还有就是我们事先使用了glew,这样可以使用更多的opengl函数,也可以使用glad,这两者一致,选一个就可以,在运行过程中创建窗口和context完毕以后,就可以使用opengl函数glGetString 来打印使用opengl的函数

log_info("the opengl version get:%s",glGetString(GL_VERSION));

ke在这里插入图片描述 可以看到我们使用了opengl version 4.5.0, NVIDIA 516.94 是所用驱动版本,下面是较为完整的代码演示:

Window::Window(void)
{
  m_quit = false;

  if (SDL_Init(SDL_INIT_EVERYTHING & ~(SDL_INIT_TIMER | SDL_INIT_HAPTIC)) != 0)
  {
    log_err("SDL_Init error: %s", SDL_GetError());
  }

  SDL_DisplayMode mode;
  SDL_GetCurrentDisplayMode(0, &mode);

  SDL_GL_SetAttribute(SDL_GL_RED_SIZE, BITS_PER_CHANNEL);
  SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, BITS_PER_CHANNEL);
  SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, BITS_PER_CHANNEL);
  SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, BITS_PER_CHANNEL);
  SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, BITS_PER_CHANNEL * 4);
  SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, BITS_PER_CHANNEL * 2);
  SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

#if defined(GLES3)
  log_info("Using GLES 3");
  SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
  SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
  SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
#elif defined(GLES2)
  log_info("Using GLES 2");
  SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
  SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
  SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
#elif defined(EMSCRIPTEN)
  log_info("Using GLES 2");
  SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
  SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
  SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
#else
  log_info("Using GL 4");
  SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
  SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
  SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 5);
#endif

  m_fullscreen = false;

  uint32_t flags = SDL_WINDOW_OPENGL;

  if (m_fullscreen) {
    flags |= SDL_WINDOW_FULLSCREEN;
  }

  m_window = SDL_CreateWindow("Engine!", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, mode.w, mode.h, flags);
  if (m_window == nullptr)
  {
    log_err("SDL_CreateWindow error: %s", SDL_GetError());
  }

  m_glContext = SDL_GL_CreateContext(m_window);
  if (m_glContext == nullptr)
  {
    log_err("SDL_GL_CreateContext error: %s", SDL_GetError());
  }
  log_info("the opengl version get:%s",glGetString(GL_VERSION));
  SDL_GL_SetSwapInterval(0);

  int display_w, display_h;
  SDL_GL_GetDrawableSize(m_window, &display_w, &display_h);
  this->m_width = display_w;
  this->m_height = display_h;

  log_info("Window init to: %i x %i", this->m_width, this->m_height);
}
GLEW

在windows里面使用opengl的较高版本时,需要使用额外加载驱动动态库,为了避免自己写很多已经有人做过的工作,我们可以使用GLEW库,Windows平台上OpenGL的版本被固定在1.1,使用GLEW可以让我们调用更高版本的opengl,当然要驱动支持。把glew.h 包含在gl.h头文件之前 #include #include #include

然后初始化 glew,如下所示:

GLenum err = glewInit();  
if( GLEW_OK != err )  
{  
fprintf(stderr, "Error initializing GLEW: %s\n",  
glewGetErrorString(err) );  
}  

在opengl高版本使用的过程中,我们常使用glsl语言,调用glUseProgram()来启用着色器,在GPU上安装GLSL代码

在linux下安装glew sudo apt-get install libglew-dev glew-utils

关注
打赏
1663161521
查看更多评论
立即登录/注册

微信扫码登录

0.0371s