1

私は最近、この記事に基づいて線形サンプリングされたガウスぼかしを実装しました。

線形サンプリング ガウスぼかし

全体的にはうまくいきましたが、テキストにわずかなエイリアシングがあり、ピクセルの集まりが薄いようです。これの原因についてはかなり困惑しています。それは私のシェーダーまたはウェイト計算の問題ですか、それともこのメソッドを使用することの継承の欠点ですか?

バイリニア フィルタリングを使用する代わりに各ピクセルを定期的にサンプリングする場合、この問題に遭遇しないことを付け加えたいと思います。

どんな洞察も大歓迎です。重みを計算する方法のコード サンプルを次に示します。

int support = int(sigma * 3.0f);

float total = 0.0f;

weights.push_back(exp(-(0*0)/(2*sigma*sigma))/(sqrt(2*constants::pi)*sigma));
total += weights.back();

offsets.push_back(0);

for (int i = 1; i <= support; i++)
{
  float w1 = exp(-(i*i)/(2*sigma*sigma))/(sqrt(2*constants::pi)*sigma);
  float w2 = exp(-((i+1)*(i+1))/(2*sigma*sigma))/(sqrt(2*constants::pi)*sigma);

  weights.push_back(w1 + w2);
  total += 2.0f * weights[i];

  offsets.push_back((i * w1 + (i + 1) * w2) / weights[i]);
}

for (int i = 0; i < support; i++)
{
  weights[i] /= total;
}

そして、これがフラグメント シェーダーです (このシェーダーには別の垂直バージョンもあります)。

 void main()
 {
  vec3 acc = texture2D(tex_object, v_tex_coord.st).rgb*weights[0];
  for (int i = 1; i < NUM_SAMPLES; i++)
  {
    acc += texture2D(tex_object, (v_tex_coord.st+(vec2(offsets[i], 0.0)/tex_size))).rgb*weights[i];
    acc += texture2D(tex_object, (v_tex_coord.st-(vec2(offsets[i], 0.0)/tex_size))).rgb*weights[i];
  }
  gl_FragColor = vec4(acc, 1.0);

この問題を示すスクリーンショットは次のとおりです。

線形サンプルのガウスぼかしの問題

4

2 に答える 2

2

これは正しいガウスぼかしのように見えます。テキストが途切れる程度は、お使いのsigma. どのような値を使用していますか?

また、使用している投影のスケーリング マトリックスを確認します。

テキストや細いピクセル線に影響を与えずにぼかしたい場合は、

  • 結果をマイルド ハイパス フィルターの出力と合成する
  • 小さいものを使用sigma
  • カーネルの形状を変更して、ガウスではないexp(-i*i/s*s)ようにします。 ではなく、より高い過剰尖度を持つ関数を試すことができます。線形のアップ/ダウン関数、またはこのページにリストされている関数のいずれかを代わりに試すことができます: http://en.wikipedia.org/wiki/Kurtosis . それらはすべて、さまざまな程度の細かいディテールを乱すぼかしにつながります。
于 2012-12-13T17:17:49.120 に答える
0

これはバイリニア フィルタリング固有の問題です。それは避けられません。

于 2012-12-17T16:15:34.823 に答える