-2

テクスチャからピクセルごとにアルファ値を読み取って、一部のピクセルが完全に消えるようにします。テクスチャ ファイル (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 を扱うチュートリアルへのリンクをいただければ幸いです。

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

4

1 に答える 1

0

古い固定関数パイプラインを使用しているようです。そのため、テクスチャ環境を適切に構成する必要があります。具体的には、テクスチャでベース カラーを調整または置換する必要があります。どちらでも構いませんが、置換モードの方が適していると思います。

テクスチャをバインドした後、特にglTexEnviを使用してモードを設定します。

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

また、実際にブレンディングを有効にする必要があることを思い出してください ( glEnable(GL_BLEND);)

glTexEnvのリファレンス ページを見れば、固定関数のテクスチャ環境パイプラインの状態空間がいかに途方もなく複雑になったかが容易に理解できると思います。気にせず、プログラム可能なパイプライン、つまりフラグメント シェーダーを直接使用することを強くお勧めします。はい、学習曲線はかなり急勾配ですが、シェーダーを使用すると、実際に次のような読みやすいものを書くことができます

#version 330
uniform sampler3D sampler_albedo;
uniform sampler2D sampler_diffuse;
out vec4 outcolor;

main()
{
    float albedo = texture(sampler_albedo, texcood);
    vec4 diffuse = texture(sampler_diffuse, texcoord);
    outcolor = mix(basecolor, diffuse.rgb, diffuse.a) * albedo;
}

テクスチャ環境のセットアップとコンバイナーの登録に 15 行以上を費やす代わりに。

于 2013-09-08T19:17:18.013 に答える