GLX学习与分析

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

 

一、X WindowOpengGL的结合的思路

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

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

    对于X WindowOpengGLglx的关系图请参阅“Aiglx学习总结”。

 

二、应用程序的一般过程

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

三、GL扩展的实现

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值