OpenGL顯示文字 顯示字元

2021-07-13 23:49:17 字數 1753 閱讀 4676

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 。

現在讓我們來看具體的**:

#include

// ascii字元總共只有0到127,一共128種字元

#define max_char        128

void drawstring(

const

char* str)

// 呼叫每個字元對應的顯示列表,繪製每個字元

for(; *str!='/0'; ++str)

glcalllist(lists + *str);

}

顯示列表一旦產生就一直存在(除非呼叫gldeletelists銷毀),所以我們只需要在第一次呼叫的時候初始化,以後就可以很方便的呼叫這些顯示列表來繪製字元了。

繪製字元的時候,可以先用glcolor*等指定顏色,然後用glrasterpos*指定位置,最後呼叫顯示列表來繪製。

_glrasterpos中的引數並不是螢幕座標,而是世界座標,這就是為什麼我以前如果用(0,0)作為引數的話,位置是在螢幕的中心

opengl顯示文字

wglusefontbitmaps 函式顯示文字 使用wglusefontbitmaps 將ascii字元裝入顯示列表,然後使用glcalllists 函式利用顯示列表序列顯示文字。wglusefontbitmaps有四個引數,分別是當前使用的dc 從第幾個ascii字元起始裝入列表 裝入列表的as...

OpenGL文字顯示

opengl文字顯示 2010年06月22日 本文參考nehe第13課影象字型。大致三步 1.建立字型的函式 buildfont 建立位圖字型 glvoid buildfont glvoid 其中base是乙個全域性變數 gluint base 繪製字型的顯示列表的開始位置 關於createfont...

OpenGL顯示文字 顯示漢字

本文 http blog.sina.com.cn s blog 4ff085000100dew0.html 原則上,顯示中文和顯示英文並無不同,同樣是把要顯示的字元做成顯示列表,然後進行呼叫。但是有乙個問題,英文本母很少,最多只有幾百個,為每個字母建立乙個顯示列表,沒有問題。但是漢字有非常多個,如果...