14

これは単純な質問であるといいのですが: OpenGL テクスチャがあり、その不透明度を変更できるようにしたいのですが、どうすればよいですか? テクスチャには既にアルファ チャネルがあり、ブレンドは正常に機能しますが、テクスチャ全体の不透明度を下げて背景にフェードできるようにしたいと考えています。をいじりましglBlendFuncたが、うまくいきませんでした。利用できない のようなものが必要なようGL_SRC_ALPHA_MINUS_CONSTANTです。OpenGL ESを使用してiPhoneで作業しています。

4

8 に答える 8

19

OpenGL ES についてはわかりませんが、標準の OpenGL では、使用する前にテクスチャの色を宣言して不透明度を設定します。

//          R,   G,   B,   A
glColor4f(1.0, 1.0, 1.0, 0.5);

この例では、テクスチャの色に影響を与えずに 50% のアルファを提供します。他の値を調整することで、テクスチャの色も変更できます。

于 2008-11-03T14:46:15.987 に答える
8

テクスチャ コンバイナーを使用します。テクスチャ ステージを設定してGL_MODULATE、テクスチャと一定の色の間の操作を行います。glTexEnv次に、コード ( 、 )から定数の色を変更しますGL_TEXTURE_ENV_COLOR

これは、パフォーマンスの点で「無料」になるはずです。ほとんどの (すべてではないにしても) グラフィックス チップでは、コンバイナー操作は同じ数の GPU サイクル (通常は 1) を必要とするため、テクスチャを使用するだけでなく、変調操作 (またはその他の操作) を実行する場合もまったく同じコストになります。

于 2008-11-04T17:02:47.693 に答える
4

基本的に、2 つのオプションがあります。GL_MODULATE でテクスチャに glTexEnv を使用し、glColor4* を使用して色を指定し、アルファ チャネルに不透明でないレベルを使用します。glTexEnv は、最初にテクスチャをロードするときに 1 回だけ発行する必要があることに注意してください。ただし、頂点属性で色を指定すると、このシナリオは機能しません。つまり、設定した glColor4* 色をオーバーライドします。その場合、次の 2 つのオプションのいずれかに頼ることができます: テクスチャ コンバイナーを使用する (高度なトピック、固定パイプラインで使用するのは良くありません)、または個々の頂点の頂点カラー アトリビュートを「手動で」変更します (より大きなメッシュ)。

于 2011-01-26T08:54:45.393 に答える
2

アイデアをありがとうございました。私は glColor4f と glTexEnv の両方で遊んで、ついに glTexEnv マンページを注意深く読むように強制しました。マンページによると、GL_MODULATE テクスチャリング モードでは、結果の色は着信フラグメントにテクスチャリング カラー (C=Cf×Ct) を乗算することによって計算され、アルファについても同様です。glColor4f(1, 1, 1, opacity) を試してみましたが、うまくいきませんでしたが、呼び出しの 4 つの引数すべてに目的の不透明度を渡すとうまくいきました。(理由はまだわかりませんが。)

于 2010-04-01T07:37:36.277 に答える
1

最も簡単な方法は、テクスチャのアルファ値をその場で変更することです。ある時点でOpenGLにテクスチャについて通知するので、メモリ内にビットマップがあります。したがって、テクスチャを同じテクスチャIDに再バインドするだけです。メモリにそれがない場合(ESを使用しているため、スペースの制約のため)、glGetTexImage()を使用して、テクスチャをバッファに再度取得できます。それがクリーンなソリューションです。

ただし、操作の保存/取得には少しコストがかかるため、別のソリューションが必要になる場合があります。考えてみると、テクスチャを表示しているジオメトリの背後にあるジオメトリを操作したり、テクスチャを保持しているジオメトリのマテリアル/色を操作したりできる場合があります。おそらく、バックジオメトリの加法ブレンドが必要になるでしょう。のglBlendFuncを使用する

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA),

あなたは「簡単に」そして-もっと重要なことに-安価に-望ましい効果を達成することができるかもしれません。

于 2008-11-03T15:11:10.337 に答える
1

ほとんどの場合、cg を使用してイメージをテクスチャに変換しています。cg を使用すると、アルファがあらかじめ乗算されるため、color4f 関数の rgba にアルファを使用する必要があります。

于 2009-07-28T06:30:52.887 に答える
0

あなたは黒い背景を持っていたのではないかと思います。したがって、すべての色の量を減らすことで、効果的に色を黒にフェードさせていました.

于 2010-05-20T12:49:26.820 に答える