15. 透明、半透明と、ブレンディングの使い方

15.010 透明と、半透明、ブレンドされたプリミティブの違いは何か?

未覆い隠しであり、その表面からのライトを反映しないように透明な物質的な素材はそれの後ろのオブジェクトを示します。 クリアなガラスはほとんど透明な素材です。 ガラスは、未覆い隠しであり、通過するためにとても軽いので、許すけれども、実際、それはいくらかのライトも反映します。 完全に透明な素材は完全に見えない。

半透明な物質的な素材はそれの後ろのオブジェクトを示すけれども、それらのオブジェクトは半透明な素材により覆い隠されます。 さらに、半透明な素材は、それに当たるライトのうちのいくらかを反映し、素材を見えさせます。 半透明な素材の物質的な例は、本当の布地、薄いプラスチック、および喫煙されたガラスを含みます。

透明で、半透明である しばしば同義で使われます。 透明ではなく、半透明ではない素材は不透明です。

混合は、framebufferにおいてすでに着信プリミティブの色によって色を結合するためのOpenGLのメカニズムです。 この結合の結果はframebufferにおいてその時後ろに蓄えられます。 混合は、半透明な物質的な素材をシミュレーションするために頻繁に用いられます。 1つの例が、車の喫煙されたガラスフロントガラスをしています。 ドライバーと内部はまだ見えるけれども、それらは、喫煙されたガラスの暗い色により覆い隠されます。

15.020 透明効果はどのようにしたら使えますか?

OpenGLは、半透明な(部分的に不透明です)プリミティブをするための直接的なインタフェースをサポートしません。 しかし、ブレンド機能によって透明度効果を作成できて、原始的なデータを慎重に注文します。 網戸透明度を使うことも考慮してさしつかえありません

OpenGLアプリケーションは一般に、混合を次の通り可能にします

glEnableです(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA、GL_ONE_MINUS_SRC_ALPHA);

混合が可能であった後に 上で示されること、着信原色が、すでにframebufferに蓄えられていた色と混合される 。 glBlendFunc()はコントロールし、この混合はどのように起こりますか。 上での典型的な使用説明は、その関連したアルファ価値によって着信色を修正し、1つのマイナス 着信アルファ価値 によって宛先色を修正します。 これらの2つの色の合計は、その時後ろにframebufferに書き込まれます。

プリミティブの不透明は、glColor4*()を使って指定されます。 RGBは色を指定し、アルファパラメータは不透明を指定します。

アプリケーションにおいて緩衝している深さを使う時には、プリミティブを表現する注文に注意する必要があります。 である完全に不透明なプリミティブ必要は、最初 部分的に不透明な原始人が後ろ-前の注文に続いている で与えました。 もしプリミティブをこの注文に表現しないならば、部分的に不透明なプリミティブを通して違った形で見える原始人が、深さテストを完全に失うでしょう。

15.030 網戸のような透明効果はどうしたら作れますか?

これは、glPolygonStipple()によってポリゴン点刻法パターンを指定すること、および可能なポリゴン点刻によって透明なプリミティブをすることによって遂行されます(glEnableです(GL_POLYGON_STIPPLE))。 点刻法パターンに設定されたビットの数 半透明と不透明の量を決定する ; より多くのビット結果をより不透明なオブジェクトに設定すること、およびより少ないビットを設定することは、より半透明なオブジェクトを結果として生じます。 Screendoor透明度は、混合、それが独立な注文であるbecuaseより時々望ましい(プリミティブは後ろ-前の注文に表現される必要はない)。

15.040 OpenGL でグラスを描くにはどのようにしたら良いですか?

1人の人にガラスのように見えるものが、別のものにすることができないので、この質問は答えづらい。 続いているものは、あなた 始められる をつかまえる一般アルゴリズムです。

最初、すべての不透明なオブジェクトを場面に表現してください。 点火を使用不可にし、混合を可能にし、小さいアルファ価値によってガラス幾何学をしてください。 これはframebufferのオブジェクトへのかすかな与えを結果として生じるはずです。 (注: ガラス幾何学を分類する必要があるかもしれません。従って、それは後ろで前のZ注文に与えました。)

現在、specularハイライトを追加する必要があります。 周囲のおよび放散する材料をセットしてください。 黒くするために色づく およびspecular素材と軽い色 白 。 点火を可能にしてください。 glDepthFunc(GL_EQUAL)を設定し、そして、二回目をガラスオブジェクトに与えてください。

15.050 半透明のプリミティブ正しく描くために、後ろから前面にむかって順にプリミティブを描く必要がありますか?

もしハードウェアが宛先アルファをサポートするならば、宛先アルファを使う種々のglBlendFunc()設定によってすることができるでしょう 実験 。 しかし、これは深さ緩衝半透明な表面についてのすべての問題を解決するわけではありません。 唯一の視覚的に正しい結果を達成することが確実な方法は、前で後ろからプリミティブをソートし、することです。

15.060 ブレンディングを使いたいがアルファ情報を取得することができない。アルファ情報無しで、透明効果をブレンドするか、つくることができますか?

多くのOpenGL機器は宛先アルファをサポートしません。 特に、マイクロソフトからのOpenGL1.1ソフトウェアライブラリはそれをサポートしません。 OpenGL指定はそれを必要としません。

もし宛先アルファをサポートするシステムを持っているならば、ウィンドウを作成する時には、それを使うことは、それを要求することの簡単な問題です。 例えば、GLUT_ALPHAからglutInitDisplayMode()まで〈そして宛先アルファを使う混合機能の上で設定された〉以下など通過してください:

glBlendFunc(GL_ONE_MINUS_DST_ALPHA、GL_DST_ALPHA);

しばしば、この質問は、混合をするために、宛先アルファが必要であるという誤った仮定の下でされます。 それはそうではありません。 宛先アルファの代わりにソースアルファを使う透明度効果を得るために、混合を多くの点で用いることができます。 宛先アルファなしでプラットフォームにいるかもしれないという事実は、透明度効果を得ることを防止するべきではありません。 透明度を達成するために、方法が混合を用いるように、OpenGLプログラミングガイド6章見てください

15.070 半透明のプリミティブを描き、その後ろにもう一つのプリミティブを描きます。一つ目のプリミティブを透して二つ目のプリミティブが見えると思うのですが、実際は見えません。なぜですか?

深さ緩衝は可能ですか

もし別のポリゴンの後ろにあるポリゴンを引き、深さテストが可能ならば、新しいポリゴンは一般に、深さテストを失い、混合は全然起こりません。 一方では、もし深さテストを使用不可にしたならば、新しいポリゴンが、既存のポリゴン , それが遅れているかどうか と混合されることまたはそれの前で。

15.080 テクスチャーマップを透明や、半透明で利用するにはどのようにしたら良いですか?

それは、試している効果が達成することを信頼しています

もしテクスチャーが適用された後に、起こるように混合することを必要とするならば、OpenGL混合機能を使ってください。 これを試してください:

glEnableです(GL_BLEND);
glBlendFunc(GL_ONE、GL_ONE);

ブレンド機能のテクスチャー・マッピングに起因しているアルファ価値を使いたいかもしれません。 (GL_SRC_ALPHA、GL_ONE_MINUS_SRC_ALPHA)もしそうなら、いつも、それで始まるのに良い機能です。

しかし、もしプリミティブが、マッピングされた(すなわち、テクスチャーマップの部分が、プリミティブの潜在的な色によって現れることを可能にしてほしい)テクスチャーである時に、起こるように混合することを必要とするならば、OpenGL混合を使わないでください。 代わりに、glTexEnv()を使い、テクスチャー環境モードをGL_BLENDに設定します。 このケースにおいて、テクスチャー環境色をそのデフォルト値 of に任せたい(0、0、0、および0)。