3

昨日、原点が にあるウィンドウで FTGL フォントをレンダリングする方法top-leftに苦労しました。

この種の正書法設定を保持すると、特にFTGLフォントを適切に配置することが難しくなります。Y軸

void enable2D(int w, int h)
{
    winWidth = w;
    winHeight = h;

    glViewport(0, 0, w, h);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, w, h, 0, 0, 1);
    glMatrixMode(GL_MODELVIEW);
}

次に、次のようにレンダリングします。

glPushMatrix();
    glTranslated(X, Y + font.LineHeight(), 0);
    glScalef(1, -1, 0); //reverse scaling of y
    font.Render(str);
glPopMatrix();

さまざまなフォントのバウンディング ボックスを測定しようとしましたが、一貫性のない結果が得られました。

どうぞ:

異なるフォントフェイス 注意してくださいinconsistency of y-position of boxes

また、コード:

glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

///Draw the fonts
for (int i = 0;i < N; ++i)
{
    auto &X = x[i];
    auto &Y = y[i];
    auto &font = fonts[i];

    glColor3ub(0, 0, 0);
    glPushMatrix();
        glTranslated(X, Y + font.LineHeight(), 0);
        glScalef(1, -1, 0);
        font.Render(str);
    glPopMatrix();
}

///Draw the boxes
for (int i = 0;i < N; ++i)
{
    auto &X = x[i];
    auto &Y = y[i];
    auto &box = boxes[i];

    glColor3ub(255, 0, 0);
    glPushMatrix();
        glTranslated(X, Y, 0);
        glBegin(GL_LINE_LOOP);
        glVertex2f(box.Lower().X(),                   -box.Lower().Y());                       //top-left
        glVertex2f(box.Upper().X() - box.Lower().X(), -box.Lower().Y());                       //top-right
        glVertex2f(box.Upper().X() - box.Lower().X(), +box.Upper().Y() - box.Lower().Y() * 2); //bottom-right
        glVertex2f(box.Lower().X(),                   +box.Upper().Y() - box.Lower().Y() * 2); //bottom-left
        glEnd();
    glPopMatrix();
}

しかし、次のように、レンダリングされたフォントに完全に適合するボックスを実現したいと考えています。

ここに画像の説明を入力

適合するようにいくつかの値を手動で調整するだけです

具体的な質問は、この種の設定でレンダリングされたフォントのy 位置を計算するにはどうすればよいですか?

よくわかりませんがFTGL::Descender()、これに関係していると思いますか?

この種のトピックについて説明しているリンクはすべて回答として受け入れます。

4

1 に答える 1

2

しかし、試行錯誤の末、私は自分がやっている欠点を見つけました。

ボックス

まず、この種の座標系を使用する場合、ボックスの一番左と一番上の部分を設定する必要があることを考慮する必要がありますzero。つまり、次のようになります。

glVertex2f( 0, 0 );
glVertex2f( w, 0 );
glVertex2f( w, h );
glVertex2f( 0, h );

ですから、他のことを心配する必要はありません。そして、それfontから、指定された座標に変換するときは、左上の原点ウィンドウに相対的でなければならないことを確認します (パディング、オフセットなどはありません...)

フォント

フォントセクションで翻訳を行うと、次のようになります。

float x_offset = (font.BBox(str).Lower().X() * font_scale);
float y_offset = (font.BBox(str).Upper().Y() * font_scale);

glPushMatrix();

    ///the coorinate should now be relative the box!
    glTranslatef( x - x_offset,
                  y + y_offset,
                  0
                );
    glScalef( font_scale, -font_scale, 0); //notice the negative in y

    font.Render(str);

glPopMatrix();

今、それはこのように見えるはずです

ここに画像の説明を入力

ボックスの外側に描画されるフォントは(#6)、おそらくフォントのスタイルによるものです。

ありがとう!誰かがこれで助けてくれることを願っています:D

アップデート:

とにかく、以前の計算にエラーがありました。より正確になるように回答を更新しました。編集履歴で変更を確認できます。

アップデート:

ここでもエラーが発生しました。は、現在のテキストのFTGL::BBox現在の境界ボックスのみを返します。現在の文字列に最大のグリフの高さが存在しない場合、高さは異なる場合があります。yMaxソース コードをもう一度確認しましたが、 w/c が返される最大の高さであることがわかりません。しかし、私はiterate all over the available glpyhs and get the maximum heightそこで行うfreetypeことができます。すでにこれを行うことができる既存の機能があると思いますか? 知ってる人いる?

于 2014-03-02T08:51:58.243 に答える