4

FTGL フォント ライブラリを使用して、テクスチャ マップ フォントを作成し、画面にレンダリングしようとしています。ライブラリは、フォント グリフを保持する形式でテクスチャを作成し、文字列をレンダリングするように指示すると、期待どおりに各グリフGL_ALPHAを通過してレンダリングします。glBegin(GL_QUADS)

唯一の問題は、テキストが得られないことです。あるシナリオでは、テキストの代わりに真っ黒なボックスが表示されますが、別のシナリオでは何も表示されません。gDEBugger の下でコードを実行して、テクスチャがアップロードされ、正しく設定されていることを確認しました。すべてが正しく表示されますが、まだ出力が表示されません。

私は明白なものを試しました。glColorテキストの色を設定しようと事前に呼び出しても何も起こりません。次のように、アルファブレンディングが適切に機能することを確認しようとすることもありません。

glEnable(GL_ALPHA_TEST);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

GL_ALPHAテクスチャから画面へのレンダリングを適切に表示するために、何が欠けているのか誰にもわかりませんか?

4

1 に答える 1

3

FTGL のコードを調べてみると、API がテキスト レンダリング自体を行うように設計されていることが明らかです。内部で OpenGL 呼び出しを行うレンダリング関数を呼び出す必要があります。

別の言い方をすれば、FTGL はフォントをテクスチャにロードし、そのテクスチャ オブジェクトを渡してグリフを自分で描画させるように設計されていません。それは、できないという意味ではなく、API がそれを行うのに役立たないということです。

黒くなるのはGL_ALPHA、アクセス時にテクスチャが RGB コンポーネントに対してゼロを返すためです。テクスチャ環境で使用するためGL_MODULATE、ゼロに色の RGB 部分を乗算します。

GL_TEXTURE_ENV_MODE意図したとおりにするには、をGL_COMBINEではなく に設定する必要がありますGL_MODULATEつまり、結合環境モードを使用する必要がありますが、これは単純ではありません。シェーダーの固定機能が登場してすぐに放棄したので、私は長い間コンバイナーに触れていませんでした。したがって、次のことは一粒の塩で取ってください。環境コードがどのように見えるべきかについての推測は次のとおりです。

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PRIMARY_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);

やりたいことは、RGB 部分がglColorテクスチャから来て、アルファ部分が来る色を生成することです。これがあなたのやり方です。

英語では、最初の行は、テクスチャ環境モードが「結合」であると述べており、これにより、より複雑な操作モードがアクティブになります。次の 3 行は、色の RGB 部分の生成方法を指定します。にGL_COMBINE_RGB設定GL_REPLACEすると、ソース RGB 値 0 が出力 RGB になることを意味します。に設定GL_SRC0_RGBするGL_PRIMARY_COLORことは、ソース RGB 値 0 が原色であり、頂点処理によって生成される色であることを意味します (つまり、照明を使用していない限り、これは で渡したものですglColor)。に設定GL_OPERAND0_RGBするGL_SRC_COLORと、色をそのまま取得することを意味します (取得など、実行できる特別な操作があります1 - the color)。

次の 3 行は、出力カラーのアルファ部分がどこから来るかを設定します。にGL_COMBINE_ALPHA設定GL_REPLACEすると、ソースアルファ値 0 (ソースRGB値 0とは異なります) が出力アルファになることを意味します。に設定GL_SRC0_ALPHAするGL_TEXTUREと、ソース アルファ値 0 は現在のテクスチャ ユニットのテクスチャから取得されます。に設定GL_OPERAND0_ALPHAするGL_SRC_ALPHAと、アルファをそのまま取得することを意味します (以前と同様に、ここでアルファに何らかの変換を適用できます)。

または、OpenGL 実装でARB_texture_swizzleが使用できる場合は、swizzle マスクを設定して、GL_ALPHA形式を効果的に に変換できますGL_INTENSITY。次に、として使用できGL_MODULATEますGL_TEXTURE_ENV_MODE。ただし、ブレンド モードが であることを確認する必要がありますglBlendMode(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)GL_MODULATEは色にアルファを乗算するため、これが必要です。GL_SRC_ALPHAの代わりにを使用するとGL_ONE、アルファによる乗算を2 回行うことになります(テクスチャ環境ステージで 1 回、ブレンド ステージで 1 回)。

于 2011-12-16T00:38:14.233 に答える