OpenGL並無直接提供顯示文字的功能,而且,OpenGL也沒有自帶專門的字庫。所以,要顯示文字,就必須依賴操做系統所提供的功能了。
各類流行的圖形操做系統,例如Windows系統和Linux系統,都提供了一些功能,以便可以在OpenGL程序中方便的顯示文字。
最多見的方法就是,咱們給出一個字符,給出一個顯示列表編號,而後操做系統由把繪製這個字符的OpenGL命令裝到指定的顯示列表中。當須要繪製字符的時候,咱們只須要調用這個顯示列表便可。
不過,Windows系統和Linux系統,產生這個顯示列表的方法是不一樣的(雖然大同小異)。做爲我我的,只在Windows系統中編程,沒有使用Linux系統的相關經驗,因此本課咱們僅針對Windows系統。
編程
OpenGL版的「Hello, World!」 寫完了本課,個人感覺是:顯示文字很簡單,顯示文字很複雜。看似簡單的功能,背後卻隱藏了深不可測的玄機。 呵呵,別一開始就被嚇住了,讓咱們先從「Hello, World!」開始。 前面已經說過了,要顯示字符,就須要經過操做系統,把繪製字符的動做裝到顯示列表中,而後咱們調用顯示列表便可繪製字符。 假如咱們要顯示的文字所有是ASCII字符,則總共只有0到127這128種可能,所以能夠預先把全部的字符分別裝到對應的顯示列表中,而後在須要時調用這些顯示列表。 Windows系統中,可使用wglUseFontBitmaps函數來批量的產生顯示字符用的顯示列表。函數有四個參數: 第一個參數是HDC,學過Windows GDI的朋友應該會熟悉這個。若是沒有學過,那也不要緊,只要知道調用wglGetCurrentDC函數,就能夠獲得一個HDC了。具體的狀況能夠看下面的代碼。 第二個參數表示第一個要產生的字符,由於咱們要產生0到127的字符的顯示列表,因此這裏填0。 第三個參數表示要產生字符的總個數,由於咱們要產生0到127的字符的顯示列表,總共有128個字符,因此這裏填128。 第四個參數表示第一個字符所對應顯示列表的編號。假如這裏填1000,則第一個字符的繪製命令將被裝到第1000號顯示列表,第二個字符的繪製命令將被裝到第1001號顯示列表,依次類推。咱們能夠先用glGenLists申請128個連續的顯示列表編號,而後把第一個顯示列表編號填在這裏。 還要說明一下,由於wglUseFontBitmaps是Windows系統特有的函數,因此在使用前須要加入頭文件:#include <windows.h>。 如今讓咱們來看具體的代碼: #include <windows.h> 顯示列表一旦產生就一直存在(除非調用glDeleteLists銷燬),因此咱們只須要在第一次調用的時候初始化,之後就能夠很方便的調用這些顯示列表來繪製字符了。 繪製字符的時候,能夠先用glColor*等指定顏色,而後用glRasterPos*指定位置,最後調用顯示列表來繪製。 void display(void) { 效果如圖: |