4

RGBA値でテクスチャをロードしようとしていますが、アルファ値はテクスチャをより白くし、透明度を調整しないようです。3Dシーンでこの問題について聞いたことがありますが、私は2D用のOpenGLを使用しています。とにかくこれを修正できますか?

私はOpenGLを初期化しています

glViewport(0, 0, winWidth, winHeight);
glDisable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_DEPTH_TEST);
glClearColor(0, 0, 0, 0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, winWidth, 0, winHeight); // set origin to bottom left corner
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor3f(1, 1, 1);

スクリーンショット: 色あせたドット画像は半透明である必要があります。黒のビットは完全に透明であると想定されています。ご覧のとおり、背後に透けて見えない画像があります。

そのテクスチャを生成するコードはかなり長いので、私が何をしたかを説明します。これは、unsignedchar型の40* 30*4配列です。4文字ごとに128に設定されます(50%透明にする必要がありますか?)。

次に、それをこの関数に渡し、データをテクスチャにロードします。

void Texture::Load(unsigned char* data, GLenum format) {
    glEnable(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D, _texID);
        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, _w, _h, format, GL_UNSIGNED_BYTE, data);
    glDisable(GL_TEXTURE_2D);
}

そして...私はちょうど問題を見つけたと思います。このコードでフルサイズのテクスチャを初期化していました:

glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, _texID);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tw, th, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glDisable(GL_TEXTURE_2D);

しかし、glTexImage2DもGL_RGBAである必要があると思いますか?2つの異なる内部フォーマットを使用できませんか?または、少なくともサイズの異なるもの(3バイトと4バイト)ではありませんか?GL_BGRは、このように初期化された場合でも正常に機能します...

4

3 に答える 3

1

シーンに重複するプリミティブはありますか?

アルファを 1.0 に設定する glColor の 3 パラメータ バージョンを呼び出していることを認識していますよね?

スクリーンショットを投稿するか、別の方法で、たとえば同じ色でアルファが異なる 2 つのプリミティブを描画したときに何が起こるかを説明していただけると助かります。実際、問題を説明するコードはすべて役立つ可能性があります。

編集:

TexImage をGL_RGB( internalformatの 3 番目のパラメーターの場合) と共に使用すると、提供するピクセル データの種類に関係なく、アルファまたはアルファ値が暗黙的に 1 に初期化された 3 コンポーネント テクスチャが作成されると思います。

GL_BGRはこのパラメーターの有効な値ではありません。おそらく、実装をだまして完全な 4 バイトの内部形式を使用させているのでしょうか? (または のように 2 バイトのもの) または、 Texture::Load() 関数にGL_LUMINANCE_ALPHA渡すことを意味しますか?GL_BGRGL_RGB

于 2009-04-17T01:01:43.603 に答える