2016-04-03 15 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フル変換パイプラインを通過しますので、によって影響particularyである:

  • 現在の射影行列
  • マトリック現在のモデルビュー
  • 現在のビューポート設定

これは、あなたの質問のタイトルが間違っていることを意味します。なぜなら、ウィンドウスペースもNDCの座標もここでは関係ないからです。オブジェクト空間座標。ビットマップベースのテキストを描画するための

は、それが同一にモデルビュー を設定して投影として(あなたのビューポートのサイズに一致する)いくつかのピクセルの正確なオルト行列を設定するのが最適である。

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

なおGL数学的な規則を使用するので、起源はボトムの画面の左隅に表示されます。オルトの行列でそれを反転することはできますが、ビットマップは引き続き描かれ、そのローカルの左下辺がラスタ位置に表示されます。

あなたはその原料のすべてのことに注意する必要があります - 描画ビットマップは、固定機能は、座標変換、ように組み込みGLの行列関数とは - は完全に今では約10年ので、廃止されました。 OpenGLの最新のコアプロファイルはこれ以上サポートしていないため、フォントレンダリングにテクスチャベースのアプローチを使用する必要があります。符号付き距離フィールドを使用することは、見栄えの良いフォントを画面に表示するための非常に良い選択です。

関連する問題