日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenGL显示文字--显示英文

發(fā)布時間:2023/12/8 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenGL显示文字--显示英文 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文轉(zhuǎn)自:http://blog.sina.com.cn/s/blog_4ff085000100devp.html

?

OpenGL并沒有直接提供顯示文字的功能,并且,OpenGL也沒有自帶專門的字庫。因此,要顯示文字,就必須依賴操作系統(tǒng)所提供的功能了。
各種流行的圖形操作系統(tǒng),例如Windows系統(tǒng)和Linux系統(tǒng),都提供了一些功能,以便能夠在OpenGL程序中方便的顯示文字。
最常見的方法就是,我們給出一個字符,給出一個顯示列表編號,然后操作系統(tǒng)由把繪制這個字符的OpenGL命令裝到指定的顯示列表中。當(dāng)需要繪制字符的時候,我們只需要調(diào)用這個顯示列表即可。
不過,Windows系統(tǒng)和Linux系統(tǒng),產(chǎn)生這個顯示列表的方法是不同的(雖然大同小異)。作為我個人,只在Windows系統(tǒng)中編程,沒有使用Linux系統(tǒng)的相關(guān)經(jīng)驗,所以本課我們僅針對Windows系統(tǒng)。

OpenGL版的“Hello, World!”
寫完了本課,我的感受是:顯示文字很簡單,顯示文字很復(fù)雜??此坪唵蔚墓δ?#xff0c;背后卻隱藏了深不可測的玄機(jī)。
呵呵,別一開始就被嚇住了,讓我們先從“Hello, World!”開始。
前面已經(jīng)說過了,要顯示字符,就需要通過操作系統(tǒng),把繪制字符的動作裝到顯示列表中,然后我們調(diào)用顯示列表即可繪制字符。
假如我們要顯示的文字全部是ASCII字符,則總共只有0到127這128種可能,因此可以預(yù)先把所有的字符分別裝到對應(yīng)的顯示列表中,然后在需要時調(diào)用這些顯示列表。
Windows系統(tǒng)中,可以使用wglUseFontBitmaps函數(shù)來批量的產(chǎn)生顯示字符用的顯示列表。函數(shù)有四個參數(shù):
第一個參數(shù)是HDC,學(xué)過Windows GDI的朋友應(yīng)該會熟悉這個。如果沒有學(xué)過,那也沒關(guān)系,只要知道調(diào)用wglGetCurrentDC函數(shù),就可以得到一個HDC了。具體的情況可以看下面的代碼。
第二個參數(shù)表示第一個要產(chǎn)生的字符,因為我們要產(chǎn)生0到127的字符的顯示列表,所以這里填0。
第三個參數(shù)表示要產(chǎn)生字符的總個數(shù),因為我們要產(chǎn)生0到127的字符的顯示列表,總共有128個字符,所以這里填128。
第四個參數(shù)表示第一個字符所對應(yīng)顯示列表的編號。假如這里填1000,則第一個字符的繪制命令將被裝到第1000號顯示列表,第二個字符的繪制命令將被裝到第1001號顯示列表,依次類推。我們可以先用glGenLists申請128個連續(xù)的顯示列表編號,然后把第一個顯示列表編號填在這里。
還要說明一下,因為wglUseFontBitmaps是Windows系統(tǒng)特有的函數(shù),所以在使用前需要加入頭文件:#include <windows.h>。
現(xiàn)在讓我們來看具體的代碼:
#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 ) { // 如果是第一次調(diào)用,執(zhí)行初始化
???????????????????????? // 為每一個ASCII字符產(chǎn)生一個顯示列表
???????? isFirstCall = 0;

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

???????? // 把每個字符的繪制命令都裝到對應(yīng)的顯示列表中
???????? wglUseFontBitmaps(wglGetCurrentDC(), 0, MAX_CHAR, lists);
???? }
???? // 調(diào)用每個字符對應(yīng)的顯示列表,繪制每個字符
????for(; *str!='/0'; ++str)
???????? glCallList(lists + *str);
}

顯示列表一旦產(chǎn)生就一直存在(除非調(diào)用glDeleteLists銷毀),所以我們只需要在第一次調(diào)用的時候初始化,以后就可以很方便的調(diào)用這些顯示列表來繪制字符了。
繪制字符的時候,可以先用glColor*等指定顏色,然后用glRasterPos*指定位置,最后調(diào)用顯示列表來繪制。
void display(void) {
???? glClear(GL_COLOR_BUFFER_BIT);

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

???? glutSwapBuffers();
}

總結(jié)

以上是生活随笔為你收集整理的OpenGL显示文字--显示英文的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。