2013-05-17 70 views
3

我使用wglUseFontBitmaps在OpenGL中繪製的字體對每個字母都採用相等的空格(寬度),所以「。」例如需要與「M」一樣多的空間。我已將字體創建中的音高參數更改爲VARIABLE_PITCH,但它不會改變任何內容。實際上可以用wglUseFontBitmaps來完成,還是每個生成的位圖都需要相等的空間?OpenGL和wglUseFontBitmaps只繪製等距字母

Furthermor我正在用GetTextExtentPoint32W()查詢光柵位圖文本的寬度/高度。返回的寬度是可以的,但高度總是太大。我在黑色文本後面繪製了一個明亮的矩形,以使其在3D場景中始終可讀。爲什麼被查詢的身高如此之大?是否爲更高的字符保留空間,如「É」?

我的設置:

HFONT font;          // Windows Font ID 
font = CreateFont( -12,       // Height Of Font 
     0,        // Width Of Font 
     0,        // Angle Of Escapement 
     0,        // Orientation Angle 
     FW_EXTRALIGHT,      // Font Weight 
     FALSE,       // Italic 
     FALSE,       // Underline 
     FALSE,       // Strikeout 
     ANSI_CHARSET,     // Character Set Identifier 
     OUT_TT_PRECIS,     // Output Precision 
     CLIP_DEFAULT_PRECIS,   // Clipping Precision 
     ANTIALIASED_QUALITY,   // Output Quality 
     FF_DONTCARE | VARIABLE_PITCH,  // Family And Pitch 
     (LPCWSTR)L"Arial");    // Font Name 

    SelectObject(this->hDeviceContext, font); 

    //init display lists for text drawing 
    bool createFontLists = wglUseFontBitmaps(this->hDeviceContext, 0, 255, 1000); 
+0

這不是一個答案,而是一個建議:不要使用它。如果您想使用OpenGL繪製字體,請使用FreeType。這是一個好得多的圖書館。有幾個將freetype和opengl包裝在一起的開源庫。我相信FTGL是最成熟的。祝你好運。 – aeskreis

+0

Thx。我看了一下FTGL,但希望沒有它,但我認爲現在使用這樣的庫可能是更好的解決方案。 – Michbeckable

回答

3

我解決了自己的問題:它只是看起來像字體繪製等間隔或等寬的每一個字母,但實際上OpenGL的drawed每個字符之間的空間「」。問題在於使用std::wstring調用wglUseFontBitmaps生成的顯示列表。 錯誤圖紙是這樣的:

int length = wcslen(text.c_str()); 
glCallLists (sizeof(wchar_t) * length, GL_UNSIGNED_BYTE, text.c_str()); 

第一個參數(名單的數量被稱爲)是錯誤的。它只能是length。第二個參數告訴OpenGL如何將text.c_str中的每個字符解釋爲定義要調用的下一個顯示列表的偏移號,這裏是錯誤的。它必須是GL_UNSIGNED_SHORT,它是從0-65535開始的2Bytes。對於GL_UNSIGNED_BYTE,用於2字節字符的wstring中第二個字節的每個「0」都被解釋爲一個空格。所以,正確的調用是:

glCallLists (length, GL_UNSIGNED_SHORT, text.c_str()); 

這適用於我的情況,而不是使用unicode charaters與wglUseFontBitmaps的一般方法。它只能安全​​地覆蓋來自wstring的ASCII字符。