SDL2 使用高版本opengl

本文详细介绍了如何使用SDL2创建OpenGL窗口,包括设置OpenGL版本、兼容模式选择、GLEW库的使用,以及如何在不同平台环境下正确配置。通过实例展示了如何获取并打印OpenGL版本信息,适合OpenGL初学者和开发者参考。
摘要由CSDN通过智能技术生成

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 <GL/glew.h>
#include <GL/gl.h>
#include <GL/glu.h>

然后初始化 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qianbo_insist

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值