遊戲製作詳解自----OpenGL入門教程(四)(轉)

post0發表於2007-08-12
遊戲製作詳解自----OpenGL入門教程(四)(轉)[@more@]

  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。

  }

  //------------------------------------------------------------------

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-951747/,如需轉載,請註明出處,否則將追究法律責任。

相關文章