6

画面上で画像を移動する必要があるシステムがあります。現在pngを使用しており、目的の画面座標に配置しています。

画面解像度と必要なフレームレートの組み合わせにより、画像がまだ完全なピクセルを移動していないため、一部のフレームは同一です。残念ながら、画面の解像度は交渉できません。

サブピクセルレンダリングがエッジを滑らかにするためにどのように機能するかについての一般的な理解はありますが、シェーディングを使用して1ピクセル未満で画像を変換する方法に関するリソース(存在する場合)を見つけることができませんでした。

理想的には、これはどの画像でも使用できますが、円やリングのような単純な形状でのみ可能であれば、それも許容されます。

4

2 に答える 2

12

サブピクセル補間は比較的単純です。通常、位相シフトが必要なサブピクセル イメージ シフトに対応する、一定の位相シフトを持つオールパス フィルターに相当するものを適用します。必要な画質に応じて、たとえば 5 ポイントのLanczosまたはその他のウィンドウ化された sinc 関数を使用し、X シフトまたは Y シフト、あるいはその両方が必要かどうかに応じて、これを一方または両方の軸に適用します。

たとえば、0.5 ピクセルのシフトの場合、係数は になります[ 0.06645, 0.18965, 0.27713, 0.27713, 0.18965 ]。(係数は正規化されていることに注意してください。つまり、それらの合計は 1.0 に等しくなります。)

x - 2水平シフトを生成するには、これらの係数を からまでx + 2のピクセルで畳み込みます。

const float kCoeffs[5] = { 0.06645f, 0.18965f, 0.27713f, 0.27713f, 0.18965f };

for (y = 0; y < height; ++y)         // for each row
    for (x = 2; x < width - 2; ++x)  // for each col (apart from 2 pixel border)
    {
        float p = 0.0f;              // convolve pixel with Lanczos coeffs

        for (dx = -2; dx <= 2; ++dx)
            p += in[y][x + dx] * kCoeffs[dx + 2];

        out[y][x] = p;               // store interpolated pixel
    }
于 2011-09-14T13:48:12.843 に答える