1

私はフォント生成ソリューションに取り組んでおり、テクスチャの問題に直面しています。テクスチャ アトラスを動的に作成し、すべての文字をテクスチャ座標でマッピングしています。

「t」文字をマッピングした結果は次のとおりです: (生成されたテクスチャが上にあり、描画したものが下にあります)

問題 問題は、プリミティブ領域とテクスチャ領域のサイズが一致していないことであると思われるため、openGL がサイズを変更しようとしています。テクスチャのロード/レンダリング時に Min と Mag の両方で GL_NEAREST を使用しています

レンダリング コードは次のとおりです。

glBegin(GL_TRIANGLE_STRIP);

float twidth = 7.f / 512.f;
float theight = 11.f / 512.f;

float width = 7.f;
float height = 11.f;

float w = width / 2.f;
float h = height / 2.f;

float x = 100;
float y = 100;

float tx = 135.f / 512.f;
float ty = 0;

glTexCoord2f(tx, ty);
glVertex2f(x - w, y-h);

glTexCoord2f(tx + twidth, ty);
glVertex2f(x + w, y-h);

glTexCoord2f(tx, ty + theight);
glVertex2f(x - w, y+h);

glTexCoord2f(tx + twidth, ty + theight);
glVertex2f(x + w, y+h);

glEnd();

初期化コードは次のとおりです。

glViewport(0,0,width,height);       

glDisable(GL_LIGHTING);
glDisable(GL_DEPTH_TEST);   

// Set up the GL state.
glClearColor(1, 1, 1, 1);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);


//glDisable(GL_BLEND);
glEnable(GL_BLEND);
glEnable(GL_TEXTURE_2D);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);


glMatrixMode(GL_PROJECTION);
glLoadIdentity();

glOrtho(0, width, height, 0, -1, 1);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

テクスチャ読み込みコード:

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);


    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 512, 512,
        0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, &texBinary[0]);
4

1 に答える 1

3

あなたの問題は、OpenGL がテクスチャ座標をどのように扱うかというよくある誤解から生じています。

テクスチャ座標 0 と 1 はピクセルの中心にありません!

テクスチャは実際には多次元サンプラーであり、テクスチャ データはサンプラー補間のサポートを提供します。このサンプリングの仕組みによって、テクスチャ座標マッピングにいくつかの制約が課せられます。境界条件の 1 つは、支持点が寸法に沿って等距離であることです。ここで、OpenGL はテクスチャ ラッピングをサポートしていることを思い出してください。

画像は基本的にラスターであり、ピクセルと呼ばれる四角形のグリッドです。8 ピクセルが連続しているとします。

   |0|1|2|3|4|5|6|7|

テクスチャ座標は

   |0|1|2|3|4|5|6|7|
   ^               ^
  0.0             1.0

これはよく知られているフェンス ポストの問題です。ピクセルの中心は実際にはテクスチャ座標にあります

(0/8 + 1/8)/2, (1/8 + 2/8)/2, …, (7/8 + 8/8)/2

またはより一般的に

(2i + 1)/2N

ただし、テキスト レンダリングの場合、テクスチャをフィルタリングする必要はほとんどありません。ラスター化されたグリフを縮小すると、結果は弱く見え、ラスター化されたグリフを拡大すると、鮮明さが失われたり、エイリアスが発生したりします。

固定関数パイプラインを使用する場合は、テクスチャの四角形がこのケースに最適です。シェーダー (3 以上) の使用を義務付ける以降の OpenGL バージョンでは、サンプラー補間座標の代わりに絶対テクセル インデックスを受け入れる特別なテクスチャ サンプリング関数があります。どちらもこのタスクに完全に適しています。

また、 Vector TexturesまたはDistance Mapsを使用する必要がある場合は、グリプをサンプリングする方法がまったく異なります。

于 2012-05-25T19:07:58.653 に答える