フラグメントシェーダブラー...どのようにこの仕事をしますか?

StackOverflow https://stackoverflow.com/questions/2437977

  •  19-09-2019
  •  | 
  •  

質問

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

どのようにしてサンプル[i]を=にTexture2D(sample0、...)線画?

これは、画像をぼかすように思える、私は最初の画像を生成する必要があり、まだここでは、私は何とか私が作成しています非常にiamgeを照会しようとしています。このしくみを教えてください。

役に立ちましたか?

解決

あなたがぼやけた画像を作るために、あなたは最初の画像を作成する必要があり、それをぼかし、メモとして。このシェーダは、(ちょうど)第二工程、以前に生成された画像を撮影し、それをぼかしを行います。オリジナルの非ぼやけた画像を生成するために別の場所にコードを追加する必要があります。

他のヒント

これは、画像にぼかしカーネルを適用します。実際のテクスチャ座標の周囲tc_offsetは、サンプリング点の3×3領域を形成するために適切に適用することによって初期化する必要があります:

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

一つの方法はないの画面に、テクスチャにレンダリングするために、あなたのオリジナルの画像を生成することです。 そして、あなたはそれが後工程への入力だとして、このシェーダとテクスチャを使用して、フルスクリーンクワッドを描画イメージます。

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