質問

私はさまざまなアルファ値を持つ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 < / P>

この画像は0から255 alphaの進行であり、

を通してRGB値は255,0,0を持ちます。

しかし私が混合を無効にしてそれを描くならば、私は次のように見えるイメージを取得します: 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];
.

しかし、まだ運さない、それは赤く赤く描く。

役に立ちましたか?

解決

私はさまざまなアルファ値を持つRGBAフォーマットのメモリにロードされたテクスチャを持っています

gldisable(GL_BLEND)

しかし、私が混合不能でそれを描くならば、私は次のように見えるイメージを取得します:www.ldeo.columbia.edu/~jcoplan/alpha/no_alpha.png

これは、ソースイメージではすべての透明なピクセルが黒いので発生します。それはあなたのテクスチャ/イメージの問題、あるいはローダー関数での問題ですが、OpenGLの問題ではありません。

おそらくGLTEXENV(GL_COMBINE ...)を使用して修正することができました(つまり、アルファチャンネルに基づいて基礎となる色と混合された色の色を混ぜてください)。そしてあなたに正確なオペランドを与えることはできません。Direct3D9(D3DTOP_MODULATEALPHA_ADDCOLORを使用)で可能であるため、ほとんどの場合はOpenGLで実行する方法があります。

他のヒント

ブレンドを無効にしないでくださいが、 glblendfunc 正しいパラメータ:

glBlendFunc(GL_ONE, GL_ZERO);
.

またはあなたは

を使ってあなたのイメージのRGBチャンネルのみをアップロードするようにOpenGLに指示することができます
glPixelStorei(GL_UNPACK_ALIGNMENT, 4)
.

glTexImage2Dに設定されているFormationsのGL_RGBを呼び出す前に。それはそれがすべてのピクセルの4バイト、すなわちアルファチャンネルのスキップをすることになるでしょう。

私は同様の問題を抱えていました、そして、iOSイメージのロードがRBG値を前提として(他の答えやコメントのいくつかで説明しているように)PROMITRITSを行っていたことを発見しました。事前乗算を無効にする方法があるかどうかを知りたいのですが、その間、このスレッドこのスレッド

    // 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 ; 
        }
    }
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top