1

このコードを使用して、GLUT を使用して openGL でテキストを描画しています。

私の原点(0,0)を左上隅に設定し、適切な画面解像度ベースの調整システムを維持するコード(初期化部分):

    glViewport(0, 0, x, y);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, x, y, 0, -1, 1);
    glMatrixMode(GL_MODELVIEW);

コード(印刷部分):

void drawtext(GLfloat x, GLfloat y, const char* string )
{
    glRasterPos2f(x,y);
    while ( *string != '\0' )
         glutBitmapCharacter(p_glutfont,static_cast<int>(*string++));
}

そして、X と Y が負の座標で始まる場合 (タグとして印刷されたテキストを持つオブジェクトが部分的にビューの外にあるという事実のために、テキスト全体が描画されていないという事実だけでなく) だけでなく、すべてが完璧になります.想像してみましょう.その上にテキストタグが付いたオブジェクトがあり、 x = -40, y = 40 で左上隅からビューに入ります:

         X axis      window
 axis Y  ----------------------------
        | y=40                       |
 x=-40__|_________                   |
    |Text to print|                  |
    |_____________|                  |
        |                            |
        |                            |
        |____________________________|

正確に X => 0 座標から描画されるまで、テキストは印刷されません。また、この問題は、テキストを右側で切り取らなければならない場合には存在しません。その後、適切に印刷されます。これは、テキストの最初の位置に関係していることに私が気付いた場所です。

私の質問は-ビューポート/スクリーンマッピングを次のように適切に拡張するにはどうすればよいですか?

1) 画面のコーディネーションを左上隅 (0,0) から右下 (高さ、幅) まで保持する 2) テキストの印刷中にこれらの値を内部的に拡張して、テキストが消えるのではなく切り取られるようにする ?

調査を行いましたが、2日間解決策を見つけることができませんでした。glViewport と glOrtho で遊んでみましたが、試した変更やアプローチ (たとえば、glViewport を -x、-y、x*2、y*2 に設定するなど) のいずれもうまくいきませんでした。それらは常に私の画面調整システムを混乱させます。これは、ウィンドウ解像度ベースを維持するために不可欠です。

PS: さらに調査を行ったところ、この記事http://www.opengl.org/archives/resources/faq/technical/clipping.htmに出会いました。

10.070 ウィンドウの左端または下端の外側に初期 glRasterPos() を持つ glBitmap() または glDrawPixels() プリミティブを描画するにはどうすればよいですか?

ラスター位置がウィンドウの外側に設定されている場合、多くの場合、ビュー ボリュームの外側にあり、その後無効としてマークされます。glBitmap および glDrawPixels プリミティブのレンダリングは、無効なラスター位置では発生しません。glBitmap/glDrawPixels はラスター位置の右上にピクセルを生成するため、ウィンドウの左端または下端でクリッピングされたこのタイプのプリミティブをレンダリングすることは不可能に見えます。

ただし、ここでよく使用されるトリックがあります。ラスター位置をビュー ボリューム内の有効な値に設定します。次に、次の呼び出しを行います。

 glBitmap (0, 0, 0, 0, xMove, yMove, NULL); 

これは、OpenGL に no-op ビットマップをレンダリングするように指示しますが、現在のラスター位置を (xMove,yMove) だけ移動します。アプリケーションは、ビュー ボリュームの外側にラスター位置を配置する (xMove,yMove) 値を提供します。この呼び出しの後に glBitmap() または glDrawPixels() を使用して、希望するレンダリングを行います。

悲しいことに、このアドバイスを実行に移すことはできません。一度使用すると、テキストが完全に失われます。

4

1 に答える 1

1

これは、テキストの最初の位置に関係していることに私が気付いた場所です。

ほとんど。glRasterPos はラスター描画操作コマンドであり、入力した位置は変換パイプラインを通過します。ポイントが (ビューポートではなく) クリップ ボリュームの外側にある場合、そのポイントは破棄され、クリップされない新しい glRasterPos が指定されるまで、それ以降のラスター描画操作はすべて無効になります。

簡単で推奨される解決策は、ラスター描画操作をまったく使用しないことです。これは、遅く、サポートが不十分であり、後の OpenGL から完全に削除されているためです。glutBitmapCharacter はラスター描画操作を使用しています。

代わりに、テクスチャ マップ フォントまたはストローク文字を使用してください。Google は、これらに関する数え切れないほどの情報を見つけています。

于 2012-10-03T09:40:47.270 に答える