Advanced Computer Graphics

計算機繪圖技術的編程及理論指導
正文

openGL

(2005-04-30 11:16:20) 下一個

1.引 言

  OpenGL是一種相對新的工業標準,它的前身是由SGI公司為其圖形工作站開發的IRIS GL,是一個工業標準的三維計算機圖形軟件接口。

  OpenGL不是一種編程語言,而是一種API(Application Programming Interface,應用程序編程接口)。作為一種API,OpenGL庫遵循C調用約定,這意味著我們在C語言環境下可以很方便的調用 OpenGL庫中的API函數。

  Microsoft開始把 OpenGL集成到Windows NT中,後來又把它集成到新版本的Windows 95 OEM Service Release 2中,用戶既可以在 Windows 95、Windows NT環境下開發OpenGL應用程序,又可以很方便的把已有的工作站上的程序移植過來。

  2.雙緩衝技術

  這項技術能使你執行繪圖代碼時能夠在一個屏幕之外的緩衝區內進行渲染,然後用交換命令把圖形放到屏幕上。雙緩衝技術有兩種用途,第一個是有些複雜的圖形可能要花很長的時間繪製,而你又不希望圖像繪製的所有步驟都被看見,使用雙緩衝技術就可以合成一幅圖像並在完成後才顯示出來。用戶永遠不會看到不完整的圖像,隻有整幅圖像準備就緒之後才會把它在瞬間置於屏幕之上。雙緩衝技術的第二個用處是製作動畫。每一幀都在畫麵外的緩衝區繪製,完成之後再交換到屏幕上。

  OpenGL支持雙緩衝,但是並不是真正用來交換前台緩衝區和後台緩衝區的。

  實際上,每個OpenGL支持的窗口係統都可以通過一個函數調用來實現前後緩衝區之間的交換。

  ★ 在Windows編程環境下調用下麵函數:

SwapBuffers(dc);

  ★ 在C語言編程環境下調用下麵函數:

glutSwapBuffers();
3.在C語言編程環境下如何實現動畫
 
  在C語言編程機製下實現OpenGL動畫,主要是通過調用OpenGL API函數庫來實現,以下便是具體的實現代碼框架。
………
………//#include調用,及變量聲明,相關函數聲明和函數定義。
// 主函數入口
void main(void)
{
 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
 //指定一個雙緩衝窗口,這使得所有繪圖代碼都在畫麵外緩衝區進行渲染。
 glutCreateWindow("NAME");
 glutDisplayFunc(RenderScene);//調用RenderScene函數繪製當前窗口
 …………
 glutTimerFunc(33, TimerFunction, 1);//登記一個回調函數,經過設定的時間值後由GLUT調用該函數。
 …………
 glutMainLoop();//這個函數開始主GLUT事件處理循環。
}
//主函數中所調用的函數定義
………
void RenderScene(void)
{
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 //清除顏和深度緩衝區。
 glColor3ub(255,0,0);//設置當前顏色為紅色。
 glPushMatrix();//將當前矩陣壓入堆棧
 glRotatef(dIst, 1.0f, 1.0f, 3.0f);
 //所畫物體繞經過(0,0,0),(1,1,3)的矢量逆時針旋轉dIst的角度。
 glTranslatef(10.0f,0.0f, 0.0f);//將所化物體沿X軸平移10個單位。
 glutSolidSphere(8.0f, 15, 15);//畫一個實心圓。
 glPopMatrix();//彈出先前所壓矩陣
 dIst += 10.0f;
 if(dIst > 360.0f)
  dIst = 0.0f;
  glutSwapBuffers();//在雙緩衝模式下進行一次緩衝區交換。
}

………
void TimerFunction (int value)
{
 glutPostRedisplay();//刷新當前窗口
 glutTimerFunc(33, TimerFunc, 1);
}

  上述相關代碼主要完成了在屏幕上繪製一個繞經過(0,0,0),(1,1,3)的矢量逆時針旋轉的小球。每隔33毫秒刷新一次。

  具體運行結果如圖1所示:


圖1. C語言環境下滾動的小球

  4.在Windows編程環境下如何實現動畫

  在Windows編程模型中,實現動畫的方法有很多種,這裏我們隻介紹一種很常用的方法。

  ★ 計時器實現動畫的方法

  在Windows編程模型中,用計時器方法來實現動畫是很方便的。在編程環境下創建一個計時器,該計時器通知Windows想讓WM_TIMER消息隔多長時間給你的窗口發送信息。Windows通過響應這個消息,就能夠以一定的時間間隔完成你所要完成的任務。

LRESULT CALLBACK WndProc( HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{ ………
………//聲明變量
switch (message)// Windows的消息處理
{
case WM_CREATE:
{
hDC = GetDC(hWnd); //得到窗口的句柄。
SetDCPixelFormat(hDC);//設置像素格式。
………
SetTimer(hWnd,101,33,NULL);//該函數創建一個有指定超時值的計時器。}
break;
case WM_DESTROY:
{
KillTimer(hWnd,101);//刪除計時器。
………}
break;
case WM_TIMER:
{………
InvalidateRect(hWnd,NULL,FALSE);}
break;
/*處理計時器事件時,設置一個情況語句用來處理WM_TIMER消息,在該消息處理語句中,我們可以實現OpenGL中所要求的渲染,貼圖等,也可以產生連續更新的圖像,這也是我們所要求的動畫。當然,我們在該消息處理語句中,也可以不加入上述代碼,隻是簡單的加入使應用程序窗口無效的語句,而具體的渲染或動畫產生代碼則可以加入WM_PAINT消息處理程序中。*/
case WM_PAINT:
{ ………
RenderScene();//該函數產生動畫。
SwapBuffers(hDC);// 緩衝區交換。
………
ValidateRect(hWnd,NULL);//使窗口生效。
}
break;
default: // Passes it on if unproccessed
return (DefWindowProc(hWnd, message, wParam, lParam));//確保每一個消息都得到處理。
}

return (0L);
}
………
void RenderScene()
{
//加入相應的動畫實現代碼
}
………

 具體實現結果如圖2所示

/*在上述代碼中,我們可以看見在WM_PAINT消息處理程序中有ValidateRect語句,該語句使窗口生效。如果我們省略該函數,那麽Windows操作係統認為窗口總處於刷新的狀態,並且會時刻將WM_PAINT消息流發送給應用程序。這樣我們可以看見動畫的幀速率增加了很多。*/

  具體運行結果如圖2所示:

2. Windows編程環境下滾動的小方塊

  5.小結

  綜上所述,我們詳細介紹了OpenGL動畫的生成原理,以及如何在兩種編程環境下實現動畫的具體代碼。在C語言編程機製下,我們主要使用GLUT庫函數來實現動畫,具體的相關函數的應用我們可以參考OpenGL庫函數。

  在Windows編程機製下,讀者應該具有Windows入門級編程的基本知識,而且你也應該對Windows API 函數庫有相當的了解,這樣你才會熟練掌握該方法。正如以前所說,在該機製下我們有多種實現動畫的方法,比如:事件插入循環,使用渲染線程等等。這裏我們就不做一一介紹,具體的實現框架與上述方法類似。
雙緩衝技術對於在任何一種機製下實現動畫都是必要而且有效的。

[ 打印 ]
閱讀 ()評論 (1)
評論
目前還沒有任何評論
登錄後才可評論.