0

私のアプリケーションでは、2 つのテクスチャを乗算し、結果を 2 より大きい係数で乗算する必要があります。これには GL_MODULATE と GL_RGB_SCALE を使用しています。これには次のコードを使用します

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, Input.texID);
glEnable(GL_TEXTURE_2D);


glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, Temp64.texID);
glEnable(GL_TEXTURE_2D);
// glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_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, Temp64.wide, Temp64.high, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);

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_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS);

glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE,   4.0);

glBindFramebufferOES(GL_FRAMEBUFFER_OES, SystemFBO);
glViewport(0, 0, wide, high);
//glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

OpenGL ES 1.1 仕様の私の理解によると、テクスチャ間の最初の変調が行われ、次に 4 による乗算が行われ、[0 1] にクランプされます。

仕様書にはこうある

「TEXTURE ENV MODE の値が COMBINE の場合、テクスチャ関数の形式は、表 3.17 に従って、COMBINE RGB と COMBINE ALPHA の値に依存します。テクスチャ関数の RGB と ALPHA の結果は、次に、それぞれ RGB SCALE と ALPHA SCALE の値。結果は [0, 1] にクランプされます。"

しかし、私が気付くのは違います。最初にテクスチャ ユニット 1 を 4 で乗算し、[0 1] にクランプしてから、テクスチャ ユニット 0 で変調します。ただし、変調後に RGB_SCALE を適用する必要があります。

変調結果を FBO に書き込んでスケーリングを使用しようとしましたが、うまくいきませんでした。

私がやりたいのは、画像を別の画像で乗算し、その結果に 2 より大きい値を乗算することです。2 番目の乗算までクランプを行うべきではありません。誰か助けてくれませんか?

4

1 に答える 1

0

過去に、あなたが言及したものと同様のテクスチャ コンバイナーに関連するいくつかの問題がありました。最新のハードウェアには固定機能パイプラインがないため、すべての機能がシェーダーを介して実装され、これらの実装の一部は予期しない結果をもたらします。

ターゲット プラットフォームは何ですか? 私の提案は、テクスチャ コンバイナーを完全に取り除き、すべてのコードをシェーダーに移動することです (ターゲット プラットフォームで許可されている場合)。

また、コードを正しく読んでいる場合は、最初のテクスチャをバインドした後に glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE) を配置して、glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS) を呼び出すときに使用できるようにする必要があります。

glEnable(GL_TEXTURE_2D) も間違って配置されており、他のテクスチャ関連関数の前に呼び出す必要があります。

于 2013-04-29T00:59:27.647 に答える