4
uniform sampler2D sampler0;
uniform vec2 tc_offset[9];
void blur()
{
  vec4 sample[9];
  for(int i = 0; i < 9; ++i)
    sample[i] = texture2D(sampler0, gl_TexCoord[0].st + tc_offset[i]);

  gl_FragColor = (sample[0] + (2.0 * sample[1]) + sample[2] +
      (2.0 * sample[3]) + sample[4] + 2.0 * sample[5] +
      sample[6] + 2.0 * sample[7] + sample[8] ) / 13.0;
}

sample[i] = texture2D(sample0, ...) 行はどのように機能しますか?

画像をぼかすように思えます。最初に画像を生成する必要がありますが、ここでは、生成しているまさにその画像を何らかの形で照会しようとしています。これはどのように作動しますか?

4

3 に答える 3

6

イメージにブラー カーネルを適用します。tc_offset実際のテクスチャ座標の周囲にサンプリング ポイントの 3x3 領域を形成するために、アプリケーションによって適切に初期化される必要があります。

0   0   0
0   x   0
0   0   0

(x が元の座標であると仮定します)。左上のサンプリング ポイントのオフセットは になります-1/width,-1/height。中心点のオフセットは、慎重にテクセルの中心に合わせる必要があります (0.5 のずれの問題)。また、ハードウェア バイリニア フィルターを使用して、ぼかしの量を安価に増やすことができます (テクセル間のサンプリングによる)。

シェーダーの残りの部分は、距離によってサンプルをスケーリングします。通常、これも事前に計算されます。

for(int i = 0; i < NUM_SAMPLES; ++i) {
    result += texture2D(sampler,texcoord+offsetscaling[i].xy)*offsetscaling[i].z;
}
于 2010-03-13T10:37:56.187 に答える
5

1 つの方法は、元の画像を生成して、画面ではなくテクスチャにレンダリングすることです。そして、このシェーダとテクスチャを入力として使用してフルスクリーンのクワッドを描画し、画像の後処理を行います。

于 2010-03-13T10:38:32.533 に答える
4

お気づきのように、ぼやけた画像を作成するには、まず画像を作成してから、それをぼかす必要があります。このシェーダーは、(ちょうど) 2 番目のステップを実行し、以前に生成された画像を取得してぼかします。ぼやけていない元の画像を生成するには、別の場所にコードを追加する必要があります。

于 2010-03-14T03:45:25.633 に答える