Pocket

cyberagent製のGPUImageFilterのシェーダは、java/kotlinの文字列で定義されています。

次は、GPUImageContrastFilter.java の CONTRAST_FRAGMENT_SHADERです。

文字列のまま編集するのは、面倒なんですね。行ごとに、ダブルクォートで囲んで、行末に「+」をつける必要があります。

別ファイルにしたいなと思って探したら、GPUImageFilterにloadShaderメソッドとconvertStreamToStringメソッドがありました。

(1)loadShaderメソッド

loadShaderメソッドは、assetsから読み込みます。次のように使います。

GPUImageGrayscaleFilterを機能はそのままで、シェーダー文字列をassetsに出して、MyGPUImageGrayscaleFilterを作ってみます。

まず、assets/gpuimage/my_grayscale.c を新規作成します。

次に、MyGPUImageGrayscaleFilter.javaを作ります。

GPUImageFilterのインスタンスを作る箇所では、上で用意したcreateメソッドを使います。

または、次のように MyGPUImageGrayscaleFilter.javaを作っておき、

インスタンスを作る側で、assetsから読み込んでもいいと思います。

(2) convertStreamToStringメソッド

convertStreamToStringメソッドは、RAWリソースのファイルから読み込みます。

res/raw/my_grayscale.txt を新規作成します。内容はさきほどの assets/gpuimage/my_grayscale.c と同じ内容です。

GPUImageFilterのインスタンスを作る箇所では、上で用意したcreateメソッドを使います。

または、次のように MyGPUImageGrayscaleFilter.javaを作っておき、

インスタンスを作る側で、R.rawから読み込んでもいいと思います。