テクスチャを部分的に透明にする方法は?


13

グッドモーニングStackOverflow、openGLでテクスチャの一部を透過的にレンダリングする方法を見つけることができないように見えるので、私は今少し問題を抱えています。

私の設定は次のとおりです。壁を表すクワッドがあり、このテクスチャで覆われています(アップロードのためにPNGに変換されます)。明らかに、ガラスのペインを除いて、壁を不透明にしたいです。壁の後ろには、風景を表示することになっている別の飛行機があります。窓の後ろから景色を眺めたいです。各テクスチャは、アルファチャネルを持つTGAです。

「風景」が最初にレンダリングされ、次に壁がレンダリングされます。私はこの効果を達成するのに十分だと思ったが、明らかにそうではない。透明であると思われるウィンドウの部分は黒で、壁を通り過ぎると風景が表示されます。

GLBlendFunc()を有効にしてからいじろうとしましたが、うまくいかないようです。

重要なステップを忘れていますか?

ありがとうございました :)


こんにちは、gdseへようこそ。私は少し編集を行いましたが、質問の見出しにタグを付けるのは好きではありません(特に、同じタグをタグで使用する場合:))。そしてあなたの質問に。固定パイプラインまたは独自のシェーダーを使用していますか?
ノタベン

編集していただきありがとうございます。「固定パイプライン」の意味はわかりませんが、すべての頂点を手動で構築し、シェーダーは使用しません。それが重要な場合は、学校の割り当て用であるため、openGLの最後のバージョンを使用していません(openGL 3だと思います)。
メガマウス

質問に写真を含めることができれば素晴らしいと思います。元の場所から姿を消したようです。
またはマッパー

回答:


19

あなたが述べたすべて(アルファチャンネルのテクスチャ、壁+窓を描く前に風景を描く)に加えて、あなたはさらに2つのことをする必要があります。

まず、OpenGLのブレンド機能を有効にする必要があります。

glEnable(GL_BLEND);

第二に、ブレンドされたピクセルの色を計算する方法をOpenGLに指示する必要があります(偶然OpenGLは「フラグメント」と呼びます)。この場合、次のような単純なもので十分です。

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

ブレンドがオンになると、OpenGLはglBlendFuncで指定した関数パラメーターに従ってピクセルの色を組み合わせます。具体的には、「source.color * source.alpha + destination.color *(1-source.alpha)」を実行します。「source」は現在レンダリングしているテクスチャ、「destination」は既にレンダリングされている色ですフレームバッファ(ランドスケープ)。したがって、アルファチャネルが白の場合は壁の色を取得し、アルファチャネルが黒の場合は風景の色を取得します。アルファチャネルが灰色の場合、2つの色の間でクロスフェードが発生します。

ウィンドウが完全に透明な場合、他の方法もあります。2つのポリゴンを描画する順序は重要ではありませんが、アルファしきい値などのより高度な概念になります。現在の状況ではおそらく必要ありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.