SoundPotentialFrameの開発で簡単にできそうだったのでOpenGLシェーダーのフィルター利用機能実装を試みてみました。しかしWebで簡単に入手できる情報には古いものも多く、見よう見まねで適用するだけでは使えなかったりで動くようになるまで四苦八苦。ProcessingでOpenGLシェーダーが利用可能になったのはバージョン2.0で、その後ProcessingもOpenGLも(シェーダ記述言語GLSLも)バージョンアップを重ねているため、いろいろ情報に齟齬が生じている模様です。いや、Processing公式の説明をちゃんと読めって話なわけですが。
具体的には次のあたりで引っかかっりました:
- Processingからの入力を受け取るuniform変数の名前を
textureSampler
としているものがありますが、2018年現在はtexture
になっています。 - Processingの入力からピクセルの値を抽出する関数を
texture2D
としているものがありますが、GLSLの最新版ではtexture
になっています(texture2D
でも動きます)。 texture
関数の第二引数に与える値の計算を、gl_FragCoord
をvec2型の変数で割っているものがありますが、非除数の側にgl_FragCoord.xy
とメンバーを明示する必要があります。明示しないとコンパイルエラーになります。- 出力用out変数は、かつては
gl_FragColor
固定だったそうですが、現在は任意の名前を利用できます。
これらの苦難を乗り越えて作成したはじめてのシェーダーが次になります。グレースケール変換。
変換式はCマガジン1998年10月号の特集「アルゴリズム大全」、「第4章 画像のためのアルゴリズム」(昌達K'z(末次和孝))に掲載されたものです。これで白黒テレビ相当になるのだとか。
Processingのシェーダーを使わないfilterメソッドはピクセルを愚直にひとつひとつ処理しているので速くなりようがありません。OpenGLシェーダーのフィルター利用はその欠点を解消します。GLSLでフィルターを記述する手間はかかりますが、Processingが標準で用意する程度のものならWebにあるサンプルだを活用すればそれほどむずかしくはないと思います(たぶん……私がひっかかったような点をあらかじめ回避できれば……)。私もシェーダー利用で表現の幅を広げたいところです……えーと、その、広げられる表現なるものが私にあったとしての話ですが……
公開: / 最終更新日: