2015-02-11 66 views
0

我正在嘗試爲我正在處理的小遊戲做一個簡單的文本呈現引擎。我試圖遵循各種教程,但我從未在Y座標上獲得過正確的位置。轉換freetype上的字形時出現奇怪的轉換

現在我下面這個教程: http://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_Text_Rendering_01

我知道字形正在正確加載,因爲我手動檢查他們。 問題是字形現在這個樣子: enter image description here

白色的東西應該是我試圖繪製字形,但出現嚴重扭曲。

我認爲這個問題是在轉型,它看起來像這樣:

float x2 = x + g->bitmap_left * sx; 
float y2 = -y - g->bitmap_top * sy; 
float w = g->bitmap.width * sx; 
float h = g->bitmap.rows * sy; 

GLfloat box[4][4] = { 
    {x2,  -y2 , 0, 0}, 
    {x2 + w, -y2 , 1, 0}, 
    {x2,  -y2 - h, 0, 1}, 
    {x2 + w, -y2 - h, 1, 1}, 
}; 

因爲它並沒有真正像不旋轉的轉變,我認爲它旋轉的字形和擴展他們的怪異方式。

但是,如果我嘗試使用GLM這樣

glm::mat4 MVP(glm::scale(glm::rotate(glm::translate(glm::mat4(1.0f), glm::vec3(x2, y2, 0.0f)), 0.0f, glm::vec3(0.0f, 0.0f, 1.0f)), glm::vec3(w, h, 0.0f))); 

串看起來幾乎正確的,但它不具備正確的Y位置。

你能指點我正確的方向嗎?

enter image description here

回答

0

我發現了什麼是錯的,原來我理解上的錯誤的方式,而這部分教程:

float x2 = x + g->bitmap_left * sx; 
float y2 = -y - g->bitmap_top * sy; 
float w = g->bitmap.width * sx; 
float h = g->bitmap.rows * sy; 

GLfloat box[4][4] = { 
    {x2,  -y2 , 0, 0}, 
    {x2 + w, -y2 , 1, 0}, 
    {x2,  -y2 - h, 0, 1}, 
    {x2 + w, -y2 - h, 1, 1}, 
}; 

它不是一個轉型的真正頂點信息和約束出來是這樣的:

glBufferData(GL_ARRAY_BUFFER, sizeof box, box, GL_DYNAMIC_DRAW); 

這樣你就可以在屏幕上獲得每個字形而不需要在着色器上進行轉換。

0

我想那是因爲你沒有使用度量數據正確地呈現每個字形。在這種情況下,我認爲你需要從每個字形的邊界框中獲取「基線」。

像這樣的東西應該得到它:

FT_GlyphSlot slot = ftFace->glyph; 
FT_Glyph glyph; 
FT_Get_Glyph(slot, &glyph); 
FT_BBox bbox; 
//get dimensions in pixels 
FT_Glyph_Get_CBox(glyph, FT_GLYPH_BBOX_TRUNCATE, &bbox); 
int baseLine = (int)bbox.yMin; 

哦,那基線添加到您的Y位置。