FTGL庫初步剖析

2021-07-02 20:18:48 字數 1701 閱讀 6000

ftgl庫是乙個跨作業系統平台的在opengl下用來渲染文字的開源庫,其內部使用了freetype2庫來處理字型相關,採用物件導向的程式設計風格,提供這種方式渲染文字,包括:bitmap方式、texture方式、polygon方式、ouline方式、extrude方式、pixmap方式、buffer方式,各種方式解釋如下:

bitmap方式:先得到字形的點陣圖資料,再使用glbitmap來繪製文字

pixmap方式:先得到字形的點陣圖資料,使用gldrawpixels來繪製文字

buffer方式:先得到字形的點陣圖資料,將文字繪製到buffer中,而不是顯示到螢幕

texture方式:先得到字形的點陣圖資料,且將該字型的所有字形位圖資料生成一張紋理,存入紋理的alph通道,每個文字對應乙個格仔區域,該格仔的座標就是文字的紋理座標,在繪製文字時,通過繪製乙個四邊形來渲染文字,將紋理貼到該四邊形上,文字就顯示出來。

polygon方式:針對向量字型,使用freetype2得到輪廓資訊,將輪廓轉為mesh繪製。

outline方式:針對向量字型,使用線框方式繪製輪廓,與polygon的區別是不填充內部。

extrude方式:針對向量字型,將輪廓拉伸繪製為3d文字。

ftgl庫中最主要是font系列類和glyph系列類,前者表示字型,後者表示乙個字形,外部使用只需知道font類。對應上述各種不同的繪製方式,有不同的font類和不同的glyph類。由於作者使用了imp模式,font系列類的每乙個子類又有乙個對應的imp類,字形系列類的每乙個子類也同樣有乙個對應的imp類。不得不說一下這種模式,模式的使用使**看起來非常費勁,這2族類的關係複雜,既有派生繼承關係,又有介面實現關係,也就是說既有上下關係,又有平行關係,而且很多邏輯聯絡非常緊密的**被分割到不同的類中,造成邏輯在類之間大距離的跳躍,實在是把問題複雜化了,很難認同這種過於看重模式的風格。

看乙個ftbitmapfont的建構函式,其任務就是根據引數中的檔案路徑名,載入字型檔案,實現過程:構造乙個實現類ftbitmapfontimpl的物件,把該物件儲存到父類的指標,在ftbitmapfontimpl的構造時,將字型路徑傳給父類ftfontimpl的建構函式,ftfontimpl再呼叫ftface來真正載入字型檔案,這個過程如下:

ftbitmapfont構造---->實現類ftbitmapfontimpl的構造----->實現類的父類ftfontimpl構造---->實現類父類子物件ftface的構造---->利用ftface載入字型檔案

這一圈子繞的夠大。

再看乙個構造字形的過程, 函式入口:ftbitmapfont::makeglyph(ft_glyphslot ftglyph),該函式根據乙個freetype2的字形,返回乙個ftgl的字形,呼叫過程如下:

ftbitmapfont::makeglyph---->ftbitmapglyph構造--->ftbitmapglyphimpl構造---->使用freetyp2取字形並轉換

渲染過程,以紋理字fttexturefont為例,render方法在其父類ftfont中,所以從ftfont開始:

ftfont::render--->紋理字實現類fttexturefontimpl::render---->子類的父類ftfontimpl::render---->字形介面類fttextureglyph::render---> 字形實現類fttextureglyphimpl::render,才是最終的渲染。

一會是父類,一會是子類,一會是實現類,一會是介面類,一會是字型類,一會跳到字形類,這種炫技式的模式論,***, 坑爹!

const的初步剖析

我考,我信心苦苦碼了這麼多次,加上自己見解,好好的寫了很多,結果最後發布時居然。沒成功。然後我那可憐的字都沒了,我哭,噴血的儲存,寫了這麼長時間的東西就這麼沒了 這次沒耐心了,只能賦值其他的有點用的拉上去了。char p hello 非const指標,非const資料 const char p he...

Eigen初步1 初步體驗Eigen庫

前言 eigen 是乙個線性算術的c 模板庫,包括 vectors,matrices,開源以及相關演算法。功能強大 快速 優雅以及支援多平台,可以使用該庫來方便處理一些矩陣的操作,達到類似matlab那樣的快捷。現在已經發展到eigen3了,目前最新版本為eigen 3.1.2。eigen使用預備工...

資料庫初步

建立乙個表people,id列設為主鍵,且自動遞增 在mysql中,create people id int not null primary key auto increment,name varchar 20 varchar 20 在sql server中 create table people...