游戏制作详解自----OpenGL 入门教程(四)-游戏开发频道-中国IT实验室-技术·资讯·教育·服务·社区
首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
 您现在的位置: 中国IT实验室 >> 游戏开发 >> 游戏开发入门 >> 正文
游戏制作详解自----OpenGL 入门教程(四)
来源:ChinaItLab 作者: 时间:2004-12-29


  OpenGL是一种基于客户/服务器和管道(PipeLine)的图形库。即一个应用程序(客户)将各种命令和数据写入管道,这命令和数据将被暂时保存起来,图形库(服务器)直到收到一条专门的指令才会开始处理它们,并将处理结果通过管道传给用户。
  所以OpenGL应用程序的基本结构就是:
  
  建立管道
  根据需要向管道中写入数据和指令
  关闭管道
  在Windows95/NT环境中,这个管道就是OpenGL着色环境——(OpenGL Render Context)简称RC。因此建立管道实际上就是获取一个可用的RC。
  
  而在Windows的GDI系统中进行图形显示是通过图形设备上下文——(Device Context)简称DC——进行的。所以获取RC就是:
  ①先获取一个DC,
  ②调整这个DC的象素格式(PixelFormat)以便OpenGL库进行绘制,
  ③用DC去调用wglCreateContext(hDC)建立一个RC,
  ④调用wglMakeCurrent(hRC,hDC)将刚才建立的RC指定为当前的RC。
  
  当一个RC不再使用时就可以删除它,方法是:
  
  使RC不是“当前RC”:
  wglMakeCurrent(NULL,NULL); //不再有当前RC
  wglMakeCurrent(hAnotherRC,hDC); //另一个RC成为当前RC
  wglDEleteContent(hRC); //删除之
  
  为了避免反复建设/删除RC所带来的不必要的开支,我们在TForm1中定义了hDC、hRC以保存DC和RC,并在TForm1的构造函数中建立并保存RC,直到清除这个Form即Destory()成员函数运行时才删除RC和DC。
  
  主要代码如下:
  
  void __fastcall TForm1::CreateParams(TCreateParams& Params)
  {
  //再次说明:只在MDI应用有必要进行修改。2000.2.17.
  TForm::CreateParams(Params); //调用原有函数预处理
  Params.Style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS;//加上必要的属性
  }
  //----------------------------------------------------
  
  __fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
  {
  hDC=GetDC(Handle); //获取一个DC,TForm1.Handle中保存有Form的窗口句柄
  SetDCPixelFormat(hDC); //调整该DC的象素格式
  hRC=wglCreateContext(hDC); //用这种DC去创建一个RC
  wglMakeCurrent(hDC,hRC); //指定当前DC、当前RC为hDC、hRC
  }
  //-------------------------------------------------------------------
  
  void __fastcall TForm1::SetDCPixelFormat(HDC hDC)
  {
  //本函数用于调整DC的象素格式,如缓冲区、颜色数等
  //先不深究,只要知道它的作用就行
  int nPixelFormat;
  static PIXELFORMATDESCRIPTOR pfd = {
  sizeof(PIXELFORMATDESCRIPTOR),    // Size of this structure
  1,                  // Version of this structure
  PFD_DRAW_TO_WINDOW |         // Draw to Window (not to bitmap)
  PFD_SUPPORT_OPENGL |         // Support OpenGL calls in window
  PFD_DOUBLEBUFFER           // Double buffered mode
  PFD_TYPE_RGBA,            // RGBA Color mode
  24,                  // Want 24bit color
  0,0,0,0,0,0,             // Not used to select mode
  0,0,                 // Not used to select mode
  0,0,0,0,0,              // Not used to select mode
  32,                  // Size of depth buffer
  0,                  // Not used to select mode
  0,                  // Not used to select mode
  PFD_MAIN_PLANE,            // Draw in main plane
  0,                  // Not used to select mode
  0,0,0 };               // Not used to select mode
  // Choose a pixel format that best matches that described in pfd
  nPixelFormat = ChoosePixelFormat(hDC, &pfd);
  // Set the pixel format for the device context
  SetPixelFormat(hDC, nPixelFormat, &pfd);
  }
  //-----------------------------------------------------------------
  
  void __fastcall TForm1::FormPaint(TObject *Sender)
  {
  //该Form的绘制响应函数
  glClearColor(0.5,0.7,0.9,1.0); //指定背景颜色(依次为RGBA)
  glClear(GL_COLOR_BUFFER_BIT); //用背景色清窗口
  RenderScence();         //场景绘制
  SwapBuffers(hDC);
  //切交缓冲区,这就是可以启动图形库处理流程并得相应结果的两条命令之一
  //如果当前RC相联DC具有DoubleBuffer的PixelFormat则用本命令
  //否则就是单缓冲DC,用glFlush(void)进行更新。
  }
  //-----------------------------------------------------
  
  void __fastcall TForm1::FormDestroy(TObject *Sender)
  {
  wglMakeCurrent(NULL,NULL); //取消当前RC和当前DC
  wglDeleteContext(hRC);   //删除该RC
  DeleteObject(hDC);     //删除Windows DC。
  }
  //-------------------------------------------------------------------
【责编:admin】

中国IT教育热线咨询

相关文章
dx8中关于用索引缓冲渲染索引图元
作为一个状态机的OpenGL
OGRE中的四元数与旋转
[RGSS]Sprite类方法教学
[RGSS]去掉“战斗|逃跑”选项
推荐文章

 精彩友情推荐
·Asp源码 PHP源码
·CGI源码 JSP源码
·建站书籍教程
·服务器软件 .net源码
·建站工具软件
·IDC资讯大全
·机房品质万里行
·IDC托管必备知识
·全国IDC报价
·网站推广优化
 基础入门  开发文档
 最新推荐
  多数的Windows程序都需要Windows.h和Windowsx.h这两个头文件,要确保使用它们。当然,你还需要其它......
游戏引擎演化史
在Windows上安装OGRE的方法
关于滤镜遮罩概念,Sobel 遮罩
游戏开发新手入门之Windows编程
游戏开发新手入门之位图化图形
教你实现卡通渲染的另类勾边方法
游戏设计大师谈如何成为一名游戏设
Visual C#编写 3D游戏框架示例
真正的 Java 学习从入门到精通
游戏开发经验——游戏开发的基本常
  为什么要研究攻击行为在人类有记载的5600年的历史中,共计发生了14,400次战争;今天,平均一天要发生............
游戏开发中显示对话的特殊句法
游戏原型设计的介绍
网络游戏中的攻击行为
谈动作类游戏的必要条件
规则的多元分析模式
载入位图文件到DirectDraw
Archer Game Suite 是什么?
浅谈游戏企划-新手入门篇
暴雪称霸游戏业界的六大秘密绝招
骨骼动画及示例Skinned Mesh的解析
  培训中心