テクスチャからピクセルごとにアルファ値を読み取って、一部のピクセルが完全に消えるようにします。テクスチャ ファイル (targa 形式) には、適切なアルファ チャネルが含まれています。
スクリーンショット: http://i43.tinypic.com/2i79s1x.png
私が使用しているオプションは次のとおりです。
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGR, //changing GL_BGR to anything else doesn't do a thing :? also tried GL_BGRA.
GL_UNSIGNED_BYTE, targaImage);
また、glBlendFunc のパラメーターの組み合わせのほとんどを試しましたが、スキップした可能性がありますが、効果を達成するものはありません。これは、通常のブレンディングを正しく行うものです (glColor のアルファに基づく):
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
長方形の描画:
glColor4f(1,1,1,0.5);
mRect->Render();
アルファを 1 に設定すると、完全に不透明になりますが、右下にまだ白が残っています。つまり、アルファはテクスチャから読み取られますが、その下の白いポリゴンが表示されます。そのため、ポリゴンを何とか非表示にする必要がありますが、テクスチャは表示されたままにします。
それが私が写真でこれを達成する方法です。私もこれを試しました:
glAlphaFunc(GL_GREATER, 0.49);
glEnable(GL_ALPHA_TEST);
長方形の各フラグメントのアルファが 0.5 であることを証明するだけです。
このテクスチャ ファイルには、中央の青い円の周りに完全な赤を含むグラデーションがありますが、アルファは左上の 0 から右下の完全な値になります (赤が白にフェードするわけではありません)。
コード全体を提供しますが、2,000 行以上あり、すべてをクラスに分割しているため、重要だと思われる部分だけを抜き出しています。
これを行うには独自のシェーダーが必要ですか? 私は数週間前に OpenGL と C++ に初めて触れたばかりで、まだ慣れていないので、それが解決策である場合は、アルファと GLSL を扱うチュートリアルへのリンクをいただければ幸いです。
ありがとうございました :)