【OpenGL】环境建立之Linux篇

【OpenGL】环境建立之windows篇

【OpenGL】环境建立之android篇

前面两篇文章介绍了opengl在windows和android系统上的环境建立,身为跨平台开发者,linux是必需在兼顾的,话说不兼顾linux系统的不叫跨平台(这是大佬们说的,我只是借用一下,请轻喷!)

Linux系统的图形窗口类似于服务器与客户端的机制,它是被设计为C-S架构,我们的图形程序通过X Window (GLX) 将3D绘图指令以X协议扩展的方式发给X Server,然后X Server再发送给显卡。GLX与Windows上的WGL比较相似。

注意在Linux上创建窗口,需要切换到桌面环境,否则创建不成功。理解了Linux图形窗口的相关机制,我们来开始创建OpenGL环境。

 获取当前显示设备

Display *display = XOpenDisplay(NULL);

检查GLX版本

if (!glXQueryVersion(display, &glx_major, &glx_minor) || 
   ((glx_major == 1) && (glx_minor < 3)) || (glx_major < 1))
{
    return;
}

配置显示设备

static int visual_attribs[] =
{
  GLX_X_RENDERABLE    , True,
  GLX_DRAWABLE_TYPE   , GLX_WINDOW_BIT,
  GLX_RENDER_TYPE     , GLX_RGBA_BIT,
  GLX_X_VISUAL_TYPE   , GLX_TRUE_COLOR,
  GLX_RED_SIZE        , 8,
  GLX_GREEN_SIZE      , 8,
  GLX_BLUE_SIZE       , 8,
  GLX_ALPHA_SIZE      , 8,
  GLX_DEPTH_SIZE      , 24,
  GLX_STENCIL_SIZE    , 8,
  GLX_DOUBLEBUFFER    , True,
  None
};

int default_screen = DefaultScreen(display);
GLXFBConfig *fb_configs = glXChooseFBConfig(display, default_screen, visual_attribs, &num_fb_configs);

获取视觉

XVisualInfo *vi = glXGetVisualFromFBConfig(display, fb_config);

创建窗口

XSetWindowAttributes swa;
Colormap cmap;
swa.colormap = cmap = XCreateColormap( display,
                                       RootWindow( display, vi->screen ),
                                       vi->visual, AllocNone );
swa.background_pixmap = None ;
swa.border_pixel      = 0;
swa.event_mask        = StructureNotifyMask;

Window win = XCreateWindow( display, RootWindow( display, vi->screen ), 
                            0, 0, 100, 100, 0, vi->depth, InputOutput, 
                            vi->visual, 
                            CWBorderPixel|CWColormap|CWEventMask, &swa );
if ( !win )
{
  return;
}

// Done with the visual info data
XFree( vi );
XStoreName( display, win, "GL 3.0 Window" );
XMapWindow( display, win );

创建opengl上下文并绑定

int context_attribs[] =
  {
    GLX_CONTEXT_MAJOR_VERSION_ARB, 3,
    GLX_CONTEXT_MINOR_VERSION_ARB, 0,
    None
  };
GLXContext context = glXCreateNewContext(display, fb_config, GLX_RGBA_TYPE, 0, True);
glXMakeCurrent( display, win, ctx );

微信号:ITComputerGraph

更多精彩内容,关注公众号《IT木子李》

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

linda012518

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

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

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

打赏作者

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

抵扣说明:

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

余额充值