驚くべき GPU 画像フレームワークを使用して、いくつかの色ベクトルをユニフォームとして渡すカスタム フラグメント シェーダーを使用してカスタム フィルターを作成しようとしています。私は Quartz を使ってそれを作成しましたが、動作しますが、このフレームワークを使用して OpenGL の世界に最初の一歩を踏み出すので、GPU 処理を試してみたいと思います。
私が作ったフラグメントシェーダは問題なく動作しているようですが、出力に問題があります。ネズミイルカをデバッグするためのサンプルを投稿します
varying highp vec2 textureCoordinate;
uniform sampler2D inputImageTexture;
bool compareVectors (lowp vec3 x,lowp vec3 y){
bool result;
if (x.r != y.r) {
return result = false;
}
if (x.b != y.b) {
return result = false;
}
if (x.g != y.g ) {
return result = false;
}
return result = true;
}
void main()
{
lowp vec3 tc = vec3(0.0, 0.0, 0.0);
lowp vec4 pixcol = texture2D(inputImageTexture, textureCoordinate).rgba;
lowp vec3 sampleColors[3];
lowp vec3 newColors[3];
sampleColors[0] = vec3(0.2, 0.2, 0.2);
sampleColors[1] = vec3(0.0, 0.0, 0.0);
sampleColors[2] = vec3(1.0, 1.0, 1.0);
newColors[0] = vec3(0.4, 0.4, 1.0);
newColors[1] = vec3(0.3, 0.4, 1.0);
newColors[2] = vec3(0.6, 0.7, 0.5);
if (pixcol.a >= 0.2) {
if (compareVectors (sampleColors[0],pixcol.rgb))
tc = newColors[0];
else if (compareVectors (sampleColors[1],pixcol.rgb))
tc = newColors[1];
else if (compareVectors (sampleColors[2],pixcol.rgb))
tc = newColors[2];
else
tc = pixcol.rgb;
}
else
tc = pixcol.rgb;
gl_FragColor = vec4(tc.rgb, pixcol.a);
}
結果の画像には多くのアーティファクトがあります。画面上ではピクセルレートのように見え、ディスクに書き込むとうまく作成されません。ここにいくつかの画面があります。
最初の画像は開始画像、2 番目は iPhone 画面上のフィルタリングされた mage のスクリーンショット、3 番目はディスクに書き込まれたフィルタリングされた画像です。それを掘り下げてみると、テクセルとピクセルは同じものではないことを思い出したので、おそらくそれらを正しくマッピングしていません。掲載順位を 1:1 にしたいのですが、おそらく実現していません。
どうすればそれを達成できますか?
ありがとう、アンドレア