SWT全接触 - 编程入门网
面的小节中介绍如何 在SWT窗口组件上用SWT绘制图形。在Eclipse最新的3.2版中,对OpenGL的支持被集成到 org.eclipse.swt 项目中,所以我们在实现的时候即可以选择以插件方式进行,也可以直接利用已经集成好的组件来进行图 形操作。在本节,我们将以插件方式为例对代码进行说明。
4.1 SWT OpenGL插件 SWT实现了OpenGL1.1全部功能。包括三个核心类和一个数据类。核心类为GLContext,GL和GLU。 GLContext架起了 SWT和OpenGL之间的桥接。一个Context必须用Drawable,通常是用Canvas来创建, OpenGL可以在Drawable上渲染场景。需要注意的是,当context不再被使用的时候就应该将它释放掉。同 样,一旦某个context被释放掉之后,就不应该再次试图去渲染它。每次 Drawable改变大小的时候, context都需要通过调用其resize方法在通知这一事件。这个方法的调用让context调整自己的view port 和视图参数。在下一节中将描述一个处理这一部分任务的类。 当context可用的时候,我们就可以通过定义在GL和GLU的一系列方法调用来绘制场景。一个GL类大概 有超过330条命令。在GL和GLU中定义的这些函数和他们的Native实现几乎是一一对应的。下图给出了一个 绘制矩形的例子,我们可以看到用C写成的API和SWT OpenGL API是何其相似: SWT全接触(13)时间:2011-11-09 IBM 薛笛4.2 SWT OpenGL编程基础 在下面的小节中,我将描述一个显示四幅3D图像的应用程序。应用程序采用了GLSense,这是一个用于 显示OpenGL场景的工具类。它和SWT 的Canvas很像,所区别的是它所展现的内容是用OpenGL命令渲染的, 而不是使用GC来绘制。要做到这一点,我们需要将一个GLContext类和一个SWT Canvas相关联,并且无论 何时,当前上下文中的内容都应该是由在drawScene中定义的命令来渲染的。 查看原图(大图) 在构造函数中,一个SWT Canvas被创建出来。这就是那个要和一个GLContext相关联的Canvas实例。紧 接着,这个Canvas又注册了两个监听器。第一个监听器的作用是确保这个Canvas无论何时被改变大小,其 相应的GLContex也会收到通知并适当的改变大小。第二个监听器主要用于确保一旦Canvas被释放之后,其 相对应的GLContext的也同时被释放。为了确保渲染区域是一个非零大小的区域,父组件的客户矩形区被 取出来用于设置该Canvas的初始大小。这个初始大小可以在稍后用布局管理器或用户Action来修改。 SWT全接触(14)时间:2011-11-09 IBM 薛笛GLScene将Canvas的全部区域用于绘图。无论Canvas何时调整其尺寸,我们都要获取客户区并将 新的宽度和高度传递给Contex,而context将根据新的宽度和高度适当的调整视图。 XML error: The image is not displayed because the width is greater than the maximum of 572 pixels. Please decrease the image width. GLScene被分割为两个部分:初始化Context和初始化OpenGL的状态机。对于Context来说,我们只是简 单的建立一个新的 GLContext并使它成为当前被使用的Context。OpenGL的渲染总是在当前的context上进 行绘制,因此如果你有超过一个活动的 GLScene,很重要的一点是要在所有绘制动作发生之前将它的 Context设置为当前的Context。initGL方法最开始提供清除颜色缓存颜色,随后建立了一个深度缓存 (depth buffer).第47行指出了深度值如何进行比较。这一比较函数主要用于拒绝或接受正在引用的像 素。GL.GL_LEQUAL选项指定接受那些在视图上更接近或有相同距离的像素。第48行启动了深度测试 (depth test),紧接的一行设定阴影模型为GL.GL_SMOOTH,这一设定的效果是如果表面上的两个顶点颜 色不同的话,系统将对颜色进行插值。最后,第 50行要求渲染引擎在计算颜色和纹理协调插值运算的时 候起到 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |