GLUT(英文全寫:OpenGL Utility Toolkit)是一個處理OpenGL程式的工具庫,負責處理和底層作業系統的呼叫以及I/O,並包括了以下常見的功能:

  • 定義以及控制視窗
  • 偵測並處理鍵盤及滑鼠的事件
  • 以一個函數呼叫繪製某些常用的立體圖形,例如長方體、球、以及猶他茶壺(實心或只有骨架,如glutWireTeapot()
  • 提供了簡單選單列的實現

GLUT是由Mark Kilgard英語Mark KilgardSilicon Graphics工作時所寫,此人同時也是《OpenGL Programming for the X Window System》以及《The Cg Tutorial: The Definitive Guide to Programmable Real-Time Graphics》兩書的作者。

GLUT的兩個主要目的是建立一個跨平台的函式庫(事實上GLUT就是跨平台的),以及簡化學習OpenGL的條件。透過GLUT編寫OpenGL通常只需要增加幾行額外GLUT的程式碼,而且不需要知道每個不同作業系統處理視窗的API。

所有的GLUT函數都以glut作為開頭,例如glutPostRedisplay()

實現

最早的GLUT函式庫是由Mark Kilgard所提供的GLX英語GLX,能夠支援X Window System,隨後被Nate Robins移植到了Microsoft Windows上(WGL英語WGL (software))。除此之外,Mac OS X亦提供了一個NSGL/Core OpenGL英語Core OpenGL的介面支援了其自身產品的架構。

由於Kilgard's的GLUT函式庫已經不再被維護,且其授權亦不允許對其函式庫的再發布或是做出改版。程式設計師開始意識到必須重新製作一個開放原始碼應用程式介面。於是第一個開源的OpenGL API:freeglut,以盡可能地保留原本介面的方式實現,並添加一些新的函數以解決原始版本的使用限制。例如OpenGLUT頁面存檔備份,存於網際網路檔案館),freeglut的其中一個分支,相較於原版本增加了一些新的功能,但在2005年5月已停止其開發。

原始版本的使用限制

原始版本的GLUT讓程式設計師難以實現某些功能,於是出現了許多非官方的擴充[1]頁面存檔備份,存於網際網路檔案館),而在某些版本的API的實現方式中也都或多或少解決了這些問題。

以下列出數種原版GLUT中常見的問題以及解決方法:

  • 原先的GLUT需要使用者呼叫一個不會退回的glutMainLoop()來使相關函數開始運作。這程式設計師讓難以將其整合到其他函數中或是自行選用其他的事件迴圈。常見的作法是引入一個名為glutCheckLoop()的函數,這個函數只會執行一次glutMainLoop()的迴圈。另一個常見的方法是使用多個執行緒,並將glutMainLoop()放在一個單獨的執行緒中,但是這個作法會引起同步的問題,並且隨著作業系統會有不同的實現方式。此外Mac OS X的GLUT更規定glutMainLoop()必須以主執行緒執行。
  • 原先的glutMainLoop()會將執行緒搶走,直到glutMainLoop()自行退出,因此程式設計師沒有一個方法可以藉由呼叫函數來直接結束程式,freeglut則藉由引入glutLeaveMainLoop()來解決這個問題。
  • 承上,原先的glutMainLoop()當視窗被關掉時就就馬上結束執行,使得程式設計師不能定義離開程式時的行為,於是許多的API並再引入另一個函數glutWMCloseFunc()可以定義程式執行結束時的所需的動作。

由於原始版本的GLUT已經被開放原始碼freeglut所取代,所以以上的問題在最原始版本的GLUT一直沒有被解決。

參見

外部連結