2

ピクセルごとに 2 つのテクスチャ A と B を動的テクスチャ C で効率的に補間し、単純なクワッドに描画するにはどうすればよいですか? マルチパスアルゴリズムが受け入れられました。

glTexImage2DCPU でフレームごとに C テクスチャを計算し、それをアルファのみのテクスチャにアップロードすることにある程度成功しました。

これは機能しましたが、パフォーマンスが不足していたため、コピー帯域幅のボトルネックを回避するために、C の次元をフル サイズの半分に縮小する必要がありました。

そのため、パフォーマンス上の理由から、Render-to-Texture を使用してすべての C テクスチャ更新を実行しようとしています。

レンダリングに必要なバッファを設定できましたが、基本的に、アルファではなく明度/RGB 情報でエンコードされたマスクを使用して、RGB または RGBA 形式のテクスチャを取得します。

これをテクスチャリング パイプラインにプラグインするために必要なアルファ テクスチャに効率的に変換するにはどうすればよいですか? プログラム可能なパイプライン (シェーダー) はなく、iPhone で使用できるテクスチャ ユニットは 2 つだけであることに注意してください。

更新: A と B は RGB のみのテクスチャです。つまり、アルファはありません。

4

1 に答える 1

6

テクスチャ A と B が RGB 画像であるとすると、おそらくそのうちの 1 つを RGBA 画像にして、1 つの画像のアルファ チャネルでマスクをレンダリングできます。これにより、iPhone の 2 つのテクスチャ ユニットの制限内に収まり、ブレンドせずに 1 回のパスでこれを行うことができます。

GLSL 疑似コード:

vec4 a = texture2D(textureA, texcoord);
vec4 b = texture2D(textureB, texcoord);
gl_FragColor = vec4(a.rgb * a.a + b.rgb * (1-a.a), dont_care.a);

ユニット 0 のテクスチャ環境: (RGB イメージ B をサンプリングし、次のステージに渡します)

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureB);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

ユニット 1 のテクスチャ環境: (画像 B はCpおよび 'Ap' ソースで使用できます。A は 'Cs' で使用できます。マスクは 'As' で使用できます。GL 仕様の表 3.15 を参照してください)。

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, textureA);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

詳細については、OpenGL ES 1.1 仕様のセクション 3.7.12 テクスチャ環境とテクスチャ関数を参照してください。

実際にシーンを画像のアルファ チャネルにレンダリングするには、glColorMask() を使用して、アルファ チャネルのみへの書き込みを許可すると役立つ場合があります。そのチャネルに実際にデータを取得する方法は、そのマスクを生成するために何を描画しているかによって異なります。

于 2009-06-16T20:20:32.363 に答える