0

2 つの RGBA8 テクスチャがあります。

A) すべてのチャネルで表示するためのデータを含む「メイン」テクスチャ

B) アルファに意味のあるデータのみを持つ「グラデーション」テクスチャ (もちろん、これは実際には A8 テクスチャである必要があります)

OpenGLES 1.1 テクスチャ コンバイナーを使用して、結果のテクセルでテクスチャ #A から RGB をコピーし、両方のテクスチャから変調されたアルファ (テクスチャ A からのアルファ * テクスチャ B からのアルファ) を使用したいと考えています。

テクスチャ コンバイナ コードに問題があり (既にモンキーを試してみました)、誰かが問題を見つけられるかどうか疑問に思っていました:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, geometryP->texName);
glTexCoordPointer(2, GL_BYTE, 0, geometryP->texCoordsP);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, mGradientTextureName);
glTexCoordPointer(2, GL_BYTE, 0, geometryP->texCoordsP);
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_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);

基本的に得られる結果は、テクスチャ #A (メイン テクスチャ) の RGBA のように見えます。

4

3 に答える 3

2

私はオフかもしれませんが、テクスチャ座標の問題に注意してください。glClientActiveTextureあなたは...を呼び出す前にglTexCoordPointer...をしていないようです

于 2009-09-18T22:59:06.867 に答える
1

BindTexture、TexEnv、glEnable(GL_TEXTURE_2D)、テクスチャ マトリックスは ActiveTexture の影響を受けますが、TexCoordPointer は影響を受けません。実際、2 番目の TexCoordPointer は不要であり、最初の呼び出しは任意の順序で行うことができました。私はもう少しモンキーしてきましたが、私の最新のコードは次のとおりです。

glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, geometryP->texName);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, mGradientTextureName);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);  
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);

この新しいコードは正しいと感じていますが、グラデーション テクスチャが間違っている可能性があるため、まだ作業中です :)

于 2009-09-19T16:09:51.337 に答える
0

Bahbar さん、申し訳ありませんが、glClientActiveTexture についてはあなたの言うことがまったく正しかったです。私はそれについて聞いたことがありませんでした (そして、私の最後の応答で glActiveTexture と混同していました)。しかし、それを使用し、TEXTURE1 に glEnableClientState と glTexCoordPointer を設定すると、機能します。

于 2009-09-19T20:35:59.803 に答える