第十一課 2D文字

2021-07-09 23:48:02 字數 1855 閱讀 9300

本課將學習如何在三維場景之上繪製二維文字。本例是乙個簡單的計時器:

我們將實現這些簡單的介面(位於common/text2d.h):

1

void

inittext2d

(const

char

*texturepath);2

void

printtext2d

(const

char

*text

,intx,

inty

,int

size);3

void

cleanuptext2d

();

為了讓**在640*480和1080p解析度下都能正常工作,x和y的範圍分別設為[0-800]和[0-600]。頂點著色器將根據實際螢幕大小做對它做調整。

完整的實現**請參閱common/text2d.cpp。

inittext2d只是簡單地讀取乙個紋理和一些著色器,並無特別之處。不過這張紋理卻不普通,來看看:

該紋理由cbfg生成。 cbfg是一種由字型生成紋理的工具。然後把紋理載入到paint.net(紅色背景僅為了方便觀察,其實是透明的)。

printtext2d負責生成乙個矩形,並正確計算出該矩形的螢幕位置和紋理座標(譯註:取字元的過程就像從報紙上剪字一樣)。

首先,填充這些緩衝:

1

std::

vector

vertices;2

std::

vector

uvs;

然後為文字中的每個字元計算其四邊形包圍盒的頂點座標,然後新增(組成這個四邊形的)兩個三角形:

1

for(

unsigned

inti=0

;i<

length;i

++)

其餘的操作和往常一樣:繫結緩衝,填充,選擇著色器程式,繫結紋理,開啟、繫結、配置頂點屬性,開啟混合,呼叫gldrawarrays。恭喜恭喜,大功告成嘍!

有一點非常重要:這些座標位於[0,800][0,600]範圍內。也就是說,這裡不需要矩陣。頂點著色器只需簡單換算就可以把這些座標轉換到[-1,1][-1,1]範圍內(也可以在c++**中完成這一步)。

1

void

main

()

片段著色器的工作量也很少:

1

void

main

()

順便說一下,這些**只能處理拉丁字元,請勿將其應用到工程中。否則您的產品在印度、中國、日本(甚至德國,因為紋理上沒有ß這個字母)就難以**了。這張紋理是我用法語字符集生成的,在法國使用沒有問題(注意 é, à, ç等字母)。修改其他教程的**時請注意庫的版本。其他教程大多使用opengl 2,和本教程不相容。不幸的是我不知道有什麼庫能較好地處理utf-8字符集。

另外,建議您閱讀joel spolsky寫的the absolute minimum every software developer absolutely, positively must know about unicode and character sets (no excuses!) by joel spolsky.

如果您需要處理大量的文字,可以參考這篇valve的文章。

Linux第十一課

apache 一 虛擬主機 apache可基於ip位址 主機網域名稱 埠號實現提供多個 同時為外部提供訪問服務的技術。使用網域名稱,要在 etc hosts檔案中做本地強制解析 基於埠號,要注意新增用於監聽埠的引數 二 訪問控制 基於源主機名 源ip位址 或源主機上的瀏覽器特徵等資訊對 上的資源繼續...

第十一課 文法

數量的說法 1 計算物品時的說法。11以上用數字計算。2 量詞 計算人 物時,或要表示某種數量時,物件不同使用的量詞也會不同。量詞直接放在數字後面使用。人 計算人數。但是,乙個人時說 人 兩個人時用 人 人 要唸 臺 計算機械,或汽車,自行車等交通工具時使用。枚 計算薄或扁平的物品。紙張,襯衫,盤子...

第十一課C 異常

異常的機制,格式如下 try 後面可以抓取很多和catch 編譯器會根據 引數來進行匹配 catch char s catch int a catch 表示剩下全部的情況 include include using namespace std classa voidk void voidkk voi...