ピクセルの配列に波及効果を実装する必要があります。各ピクセルは、ARGBカラーを表す32ビット整数です。誰かが始める方法について何か提案がありますか?
2456 次
1 に答える
3
一般に、波及効果は画像のある種の歪みであり、歪みの量は「波状」パターンでポイントごとに異なります。したがって、最初のタスクは、各ピクセルの数値を生成する「深度マッピング」を作成することです。直感的に、深度マップは元のピクセルからの波状の水面の高さを表します。実験の出発点は
#define X_CENTER 100 // x pixel position of center
#define Y_CENTER 100 // y pixel position of center
#define RADIUS 70 // approximate radius of circular wave train, in pixels
#define WAVELENGTH 10 // wavelength of ripples, in pixels
#define TRAINWIDTH 3.4 // approximate width of wave train, in wavelengths
#define SUPERPHASE 1.5 // phase vel. / group vel. (irrelevant for stills)
// returns a number from -1.0 to 1.0
double depth(int x, int y) {
double dx = x - X_CENTER ; // or int, if the center coords are ints
double dy = y - Y_CENTER ;
double r = (sqrt(dx*dx+dy*dy)-RADIUS)/WAVELENGTH ;
double k = r - (1-SUPERPHASE)*RADIUS/WAVELENGTH ;
double a = 1 / (1.0 + (r/TRAINWIDTH)*(r/TRAINWIDTH));
return a * sin(k*2*PI);
}
デプスマップ(同じリップルを多くの異なる画像に適用するだけの場合は事前に計算できます)がある場合、それをどのように処理するかについてさまざまなオプションがあります。
- 深さに比例して各ピクセルを明るくしたり暗くしたりします
- デプスマップを対角線上に数ピクセルシフトし、シフトされたマップとシフトされていないマップの違いに応じて明るくしたり暗くしたりします。
- 各ピクセルの深さとその(たとえば)東および南の隣接ピクセルの深さとの差に比例するベクトルによって、画像内の各ピクセルをわずかに移動します。特にベース画像に鮮明な軸平行エッジが含まれている場合は、視覚的に満足のいく結果を得るために、スムージングまたはオーバーサンプリングが必要になる場合があります。
これらの組み合わせやバリエーションを試して、目的の効果のイメージを概算する必要がある場合があります。
于 2011-09-11T21:10:07.843 に答える