0

フラグメントシェーダーのポイントの周りの円を計算しています。問題は、テクスチャの変化する部分が円ではなく、楕円形であるということです。形は実際にはテクスチャの形に依存します。テクスチャが完全な正方形である場合は完全な円になりますが、長方形の場合は楕円になります。これは現在のフラグメントシェーダーです。

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 - ((radius - dist) / radius) * scale;
     percent = percent * percent;

     textureCoordinateToUse = textureCoordinateToUse * percent;
     textureCoordinateToUse += center;

     gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse );
   }

   textureCoordinateToUse += center;
   gl_FragColor = texture2D(inputImageTexture,textureCoordinate);   
}

シェーダーコードの更新:

highp float aspectRatio = 854.0 / 480.0;
     //highp vec2 textureCoordinateToUse = textureCoordinate;
     highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y *    aspectRatio + 0.5 - 0.5 * aspectRatio));
   highp float dist = distance(center, textureCoordinateToUse);
   textureCoordinateToUse -= center;
   if (dist < radius)
   {
     highp float percent = 1.0 - ((radius - dist) / radius) * scale;
     percent = percent * percent;

     textureCoordinateToUse = textureCoordinateToUse * percent;
     textureCoordinateToUse += center;

     gl_FragColor = texture2D(inputImageTexture, textureCoordinateToUse );
     return;
   }

   textureCoordinateToUse += center;
   gl_FragColor = texture2D(inputImageTexture,textureCoordinate); 
4

1 に答える 1

1

私のバルジ ディストーション フラグメント シェーダを使用しようとしているようです。あなたが実際に質問したわけではありませんが、あなたがここで何を望んでいるかはわかるかもしれません。

長方形の入力テクスチャに対して正規化された 0.0 ~ 1.0 の範囲でテクスチャ座標を指定すると、上記は円形ではなく楕円形の領域で動作します。これは、上記の計算がイメージ座標空間ではなく、テクスチャ座標空間で機能するためです。

これを修正するには、次の 2 つの方法のいずれかを実行できます。まず、画像の縦横比を説明するテクスチャ座標を提供できます (そのうちの 1 つを 1.0 で最大にしないでください)。

次に、この回答で私が行っていることを実行し、画像の縦横比を均一にフィードして、それを使用して画像の長方形の性質を修正することができます。aspectRatio画像の幅と高さの比率をシェーダーに均一に指定した場合、シェーダーの本体の最初の行を次のように置き換えることができます。

 highp vec2 textureCoordinateToUse = vec2(textureCoordinate.x, (textureCoordinate.y * aspectRatio + 0.5 - 0.5 * aspectRatio));

そして、それは円形の領域で動作します。

于 2012-08-24T21:53:38.430 に答える