快速业务通道

使用Eclipse RCP进行桌面程序开发(六):向OpenGL进军 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
   // 返回 FALSE      } if(!SetPixelFormat(hDC,PixelFormat,&pfd))      // 能够设置象素格式么?      {          KillGLWindow();               // 重置显示区          MessageBox(NULL,"Can''t Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);          return FALSE;                // 返回 FALSE      } if (!(hRC=wglCreateContext(hDC)))         // 能否取得着色描述表?      {          KillGLWindow();              // 重置显示区          MessageBox(NULL,"Can''t Create A GL Rendering Context.",             "ERROR",MB_OK|MB_ICONEXCLAMATION);          return FALSE;               // 返回 FALSE      }

使用Eclipse RCP进行桌面程序开发(六):向OpenGL进军(4)

时间:2011-04-13 海边沫沫

在SWT中,我们开发OpenGL应用就要简单得多,这全部要归功于org.eclipse.swt.opengl 包下面的GLCanvas类和GLData类,使用GLCanvas类可以直接创建一个用于OpenGL渲染的控件 ,至于设置象素格式这样复杂的问题,它已经帮我们解决了,不信你看GLCanvas类的构造函 数的实现。

GLCanvas类中的几个方法代表了我一开始提到的OpenGL的几个基本概念,setCurrent()方 法就是为了把该控件的context设置为OpenGL的当前着色描述表,然后使用GL和GLU类中的方 法在当前context上进行绘图,绘制完图形以后,再使用GLCanvas类的swapBuffers()方法交 换缓冲区,也就是把context中的3D场景渲染到控件上。

写到这里,大家肯定认为一切问题都应该迎刃而解了,然而,我却碰到了另外一个困难, 这个困难就是SWT的OpenGL表现怪异,怎么个怪异呢?请看下面视图类的代码:public void createPartControl(Composite parent) {      // TODO 自动生成方法存根      GLData data = new GLData();      data.depthSize = 1;      data.doubleBuffer = true;      GLCanvas canvas = new GLCanvas(parent, SWT.NO_BACKGROUND, data);      //设置该canvas的context为OpenGL的当前context      if(!canvas.isCurrent()){        canvas.setCurrent();      }      //这里可以进行OpenGL绘图      //交换缓存,将图形渲染到控件上      canvas.swapBuffers();    }

按道理,我们应该可以得到一个经典的3D的黑色场景,但是,我得到的却是这样的效果:

使用Eclipse RCP进行桌面程序开发(六):向OpenGL进军 - 编程入门网

使用Eclipse RCP进行桌面程序开发(六):向OpenGL进军(5)

时间:2011-04-13 海边沫沫

相当的郁闷啊,就是这个问题困扰了我至少一个星期。我把官方网站上的示例看了有看, 就是找不到问题的关键所在。直到最后,我用了另外一个线程,每100ms都调用 canvas.swapBuffers()把场景渲染一遍问题才解决。由此可见,之所以回出现上面的问题, 主要是因为我们渲染的场景很快会被操作系统的其他绘图操作所覆盖,只有不断的渲染我们 才能看到连续的3D图形。

我是这样实现让3D场景连续渲染的:

public void createPartControl(Composite parent) {      // TODO 自动生成方法存根      GLData data = new GLData();      data.depthSize = 1;      data.doubleBuffer = true;      GLCanvas canvas = new GLCanvas(parent, SWT.NO_BACKGROUND, data);      //将绘图代码转移到定时器中      Refresher rf = new Refresher(canvas);      rf.run();    } Refr

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号