マーティンが述べているように、単なる色補正ではなく、画像に歪みを適用するには、その画像内のピクセルを何らかの方法で変位させる必要があります。通常、出力画像から始めて、出力の各位置を埋めるために取得する入力ピクセルの位置を特定します。
たとえば、この回答で示すピンチディストーションを生成するには、次のようなOpenGLESフラグメントシェーダーを使用します。
varying highp vec2 textureCoordinate;
uniform sampler2D inputImageTexture;
uniform highp vec2 center;
uniform highp float radius;
uniform highp float scale;
void main()
{
highp vec2 textureCoordinateToUse = textureCoordinate;
highp float dist = distance(center, textureCoordinate);
textureCoordinateToUse -= center;
if (dist < radius)
{
highp float percent = 1.0 + ((0.5 - dist) / 0.5) * scale;
textureCoordinateToUse = textureCoordinateToUse * percent;
}
textureCoordinateToUse += center;
gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse );
}
このGLSLコードは、出力画像のすべてのピクセルに適用されます。ピンチされている領域の中心から現在のピクセル座標までの距離を計算します。次に、その入力距離を取得し、入力scale
パラメーターに基づいてスケーリングします。この新しいスケーリングされた距離は、出力カラーが読み取られる入力画像の座標を移動するために使用されます。
各出力ピクセルの変位した座標で入力画像から色をサンプリングすると、入力画像の歪んだバージョンが生成されます。私のリンクされた回答でわかるように、この変位を計算するためのわずかに異なる関数は、非常に異なる歪みにつながる可能性があります。