OpenGL顯示文字--顯示英文 【轉】

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>

// ASCII字符總共只有0到127,一共128種字符
#define MAX_CHAR        128

void drawString(const char* str) {
    static int isFirstCall = 1;
    static GLuint lists;

    if( isFirstCall ) { // 若是是第一次調用,執行初始化
                         // 爲每個ASCII字符產生一個顯示列表
         isFirstCall = 0;

         // 申請MAX_CHAR個連續的顯示列表編號
         lists = glGenLists(MAX_CHAR);

         // 把每一個字符的繪製命令都裝到對應的顯示列表中
         wglUseFontBitmaps(wglGetCurrentDC(), 0, MAX_CHAR, lists);
     }
     // 調用每一個字符對應的顯示列表,繪製每一個字符
    for(; *str!='\0'; ++str)
         glCallList(lists + *str);
}windows



顯示列表一旦產生就一直存在(除非調用glDeleteLists銷燬),因此咱們只須要在第一次調用的時候初始化,之後就能夠很方便的調用這些顯示列表來繪製字符了。
繪製字符的時候,能夠先用glColor*等指定顏色,而後用glRasterPos*指定位置,最後調用顯示列表來繪製。

void display(void) {
     glClear(GL_COLOR_BUFFER_BIT);

     glColor3f(1.0f, 0.0f, 0.0f);
     glRasterPos2f(0.0f, 0.0f);
     drawString("Hello, World!");

     glutSwapBuffers();
}函數



效果如圖:
http://blog.programfan.com/upfile/200805/20080505132619.gif
相關文章
相關標籤/搜索