GLX学习与分析

GLX是X Window的一个扩展,按我的理解,它是专门为X Window实现3D渲染而开发的一个扩展。X Window没有开发自己的3D渲染的实现,而是使用了Mesa(不准确的说是OpenGL的一种实现),为了实现X Window 与OpenGL的结合,制定了GLX标准。GLX的实现主要有两个版本,一个是基于Xorg的,一个是基于XFree86的,两者差别不大,下面我们讨论的都是基于XFree86的实现。

 

一、X Window与OpengGL的结合的思路

    X Window 走的是2D的Path,而OpenGL走的是3D的path,那么两者怎么样才能有效地结合在一起,使原本走2D path的X Window具有3D的效果呢?X Window采用的方法就是由它自己创建Drawable,然后把Drawable交给OpenGL来渲染,再由OpenGL将渲染结果显示到屏幕上,从而使X Window具有3D的效果。如何把Drawable交给OpenGL就是GLX所要做的工作。

    X提供了两种Drawable: Window(onscreen)和Pixmap(offscreen)。与之对应的GLX也有GLXWindow和GLXPixmap,此外,GLX还有自己特有的位于offscreen上的GLXPbuffer,GLXPbuffer与GLXPixmap不同是它比GLXPixmap创建(在不可见的frame buffer中)更加方便。

    对于X Window和OpengGL及glx的关系图请参阅“Aiglx学习总结”。

 

二、应用程序的一般过程

     应用程序一般先用 XOpenDisplay 打开一个链接,然后通过glXQueryExtension查询是否有Glx扩展,如果不存在就做相应的处理,否则就创建一个窗口,然后通过glXGetFBConfigs得到一个GLXFBConfig,它是主要用来描述颜色缓存和一些辅助缓存的格式、类型和大小的,创建glxWindow和glxContext的时候需要指定一个GLXFBConfig。接着把刚才创建的XWindow和GLXFBConfig传给glXCreateWindow创建一个可以让OpenGL渲染的窗口。同时,通过把刚才创建的GLXFBConfig传给glXCreateNewContext创建一个Render Context。然后通过glXMakeContextCurrent把刚刚创建的Reder Context绑定到刚才创建的GLXWindow上,那么以后的GL操作都将是按照Render Context对GLXWindow的操作。其大概的流程图如下所示:  

三、GL扩展的实现

    由于在AIGLX中,GL的实现是indirect方式的,即需要通过X Server来实现,所以需要某个扩展来支持GL命令从客户端到服务器的发送,然而我找了很久都没有发现这个扩展,后来才发现原来它是通过GLX扩展来实现GL命令的传送的。

既然GLX是X的一个扩展,那么它就是满足X的扩展机制的,关于X的扩展机制可以参考absurd的X Window研究笔记。一个扩展的实现必须包含三个部分,Client,Protocol和Server,基本上一个函数(需要X Server来实现的函数)就需要在Protocol中定义一个请求的结构,然而对于GL的命令GLX却没有为每个GL函数设立一个Request,而是将所有的GL命令的发送都通过一个Reques即GLXRender请求来发送,只是每个GL命令的内部操作码不同而已。具体的代码可以参考SGI的GLX的实现中的G_render.c 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值