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 回)。