3

さまざまなアルファ値を持つRGBA形式のテクスチャをメモリにロードしています。

画像は次のように読み込まれます。

 GLuint texture = 0;
 glGenTextures(1, &texture);
 glBindTexture(GL_TEXTURE_2D, texture);
 self.texNum = texture;

 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR); 

 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, self.imageWidth, self.imageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, [self.imageData bytes]);

画像のアルファチャネルがすべて1として扱われ、テクスチャがRGB画像のように描画されるように、このテクスチャを描画する方法を知りたいです。

ベースイメージを考えてみましょう。

http://www.ldeo.columbia.edu/~jcoplan/alpha/base.png

この画像は0から255アルファへの進行であり、全体で255,0,0のRGB値を持っています

ただし、ブレンディングを無効にして描画すると、次のような画像が表示されます:www.ldeo.columbia.edu/~jcoplan/alpha/no_alpha.png

私が本当に欲しいのは次のような画像です:www.ldeo.columbia.edu/~jcoplan/alpha/correct.png

アルファチャンネルを完全に無視するようにいくつかのポインタを本当に感謝します。他のポイントでアルファチャネルが必要なため、最初は画像をRGBとしてロードすることはできないことに注意してください。

編集:私はGL_COMBINEを使用して問題を解決しようとしました:

glColorf(1,1,1,1);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PRIMARY_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); 
[self drawTexture];

しかし、それでも運がないので、それでも黒から赤になります。

4

4 に答える 4

3

さまざまなアルファ値を持つRGBA形式のテクスチャをメモリにロードしています

glDisable(GL_BLEND)

ただし、ブレンディングを無効にして描画すると、次のような画像が表示されます:www.ldeo.columbia.edu/~jcoplan/alpha/no_alpha.png

これは、ソース画像のすべての透明ピクセルが黒であるために発生します。テクスチャ/画像、またはローダー機能の問題ですが、OpenGLの問題ではありません。

おそらくglTexEnv(GL_COMBINE ...)を使用して修正を試みることができます(つまり、テクスチャカラーをアルファチャネルに基づいて基になるカラーと混合します)が、私はそのようなことをしていないので、完全にはわかりません。 tは正確なオペランドを提供します。Direct3D9(D3DTOP_MODULATEALPHA_ADDCOLORを使用)で可能だったので、openglでそれを行う方法がある可能性があります。

于 2010-07-08T16:49:37.527 に答える
1

ブレンディングを無効にしないでください。ただし、適切なパラメーターを指定してglBlendFuncを使用してください。

glBlendFunc(GL_ONE, GL_ZERO);
于 2010-07-08T16:36:51.863 に答える
0

または、OpenGLに、画像のRGBチャネルのみをアップロードするように指示することもできます。

glPixelStorei(GL_UNPACK_ALIGNMENT, 4)

glTexImage2Dformatをに設定して呼び出す前にGL_RGB。これにより、すべてのピクセルの4番目のバイト、つまりアルファチャネルがスキップされます。

于 2010-07-09T00:12:31.600 に答える
0

私も同様の問題を抱えていましたが、iOSの画像の読み込みがRBG値に対して事前乗算を行っていたことが原因であることがわかりました(他の回答やコメントで説明されています)。事前乗算を無効にする方法があるかどうか知りたいのですが、それまでの間、このスレッドこのスレッドから派生したコードを使用して「事前乗算を解除」しています。

    // un pre-multiply
    uint8_t *imageBytes = (uint8_t *)imageData ;
    int byteCount = width*height*4 ;
    for (int i=0; i < byteCount; i+= 4) {
        uint8_t a = imageBytes[i+3] ;
        if (a!=255 && a!=0 ){
            float alphaFactor = 255.0/a ;
            imageBytes[i] *= alphaFactor ; 
            imageBytes[i+1] *= alphaFactor ; 
            imageBytes[i+2] *= alphaFactor ; 
        }
    }
于 2011-12-22T22:55:10.773 に答える