2016-04-03 142 views
1

我有我的窗口座標,我需要在這裏繪製文本。如何將窗口座標轉換爲標準化的設備座標?

我用這個函數:

void displayText(std::string const& text, float x, float y) 
{ 
    int j = text.size(); 

    glColor3f(1, 1, 1); 
    // std::cout << x << " " << y << std::endl; 
    // std::cout << (x/900) * (2.0 - 1.0) <<" " <<(y/900) * (2.0 - 1.0) << std::endl; 
    x = x/(float)900; //900 is my window size 
    y = y/(float)900; 
    x-=0.5f; 
    y-=0.5f;// std::cout << x << " "<<y << std::endl; 
    glRasterPos2f(x, y); 
    for(int i = 0; i < j; i++) 
    glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, text[i]); 
} 

,但它在錯誤的繪製文本協調,上下顛倒,有什麼想法?

+0

什麼是「錯誤座標」?它與你期望的有什麼不同? – Carcigenicate

+0

我有多個文字繪製,位於窗口周圍,但所有文字都繪製在同一個點上。 –

回答

2

glRasterPos2f將通過全面改造管道,所以它是格外受:

  • 當前投影矩陣
  • 當前模型視圖基質
  • 當前設置視

這意味着您的問題標題是誤導性的,因爲窗口空間和NDC座標在這裏都不相關,但是物體空間座標。

繪製基於位圖的文字,最好是設置一些像素精確鄰矩陣(匹配視口的大小)作爲投影而MODELVIEW 設置身份:

glMatrixMode(GL_PROJECTION); 
glOrtho(0, width, 0, height, -1, 1); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glRasterPos2f(pixel_coords); 
// draw bitmaps here 

注意,GL使用數學慣例,因此原點將位於屏幕左下角的底部。 YOu可以在正交矩陣中翻轉該位置,但Bitmaps仍將被繪製,以使其局部左下邊緣出現在光柵位置。

你應該知道,所有的東西的 - 繪製位圖,固定功能座標變換,內建的GL矩陣功能等等 - 都完全因爲近十年的現在過時了。現代的OpenGL核心配置文件不再支持,你將不得不使用基於紋理的方法進行字體渲染。使用帶符號的距離字段是在屏幕上顯示漂亮字體的不錯選擇。

相關問題