OpenCVで実装した画像処理アルゴリズムを、OpenGL ESのフラグメントシェーダに移植しようとしていて、GPUImageに入っているフィルタのシェーダプログラムを参考として読み始めたものの、そもそもこのシェーダというものがよくわかってないので、下記の記事を読みつつ勉強してみました。
EZ-NET: Objective-C フラグメントシェーダー事始め
この記事は頂点シェーダについても基本から丁寧に解説されているのですが、以下は主にフラグメントシェーダまわりについて勉強になったことの抜粋です。
頂点シェーダとフラグメントシェーダ
どちらかを使うというわけではなくて、ポリゴンの頂点座標やテクスチャ位置などを元データとして、頂点シェーダーではポリゴンデータをクリッピング座標系に変換し、それを元に得られた画素データをフラグメントシェーダーが受け取って加工するという流れになるようです。
lowpとかhighpとか
精度の詳細はシェーダー言語や GPU に依存するらしいのと、詳しいことは解りませんが、シェーダー言語が演算する際にこの精度が影響してくるらしいですが、必要になったら気にしだせば大丈夫なような気がします。
0.0 から 1.0 で表す色のような情報であれば lowp で十分らしいですが、同じ 0.0 から 1.0 でも精度が必要になってくると mediump みたいな選択をするというお話もありました。
precisionは、データ型に既定の精度を設定したい場合に使うようです。
precision mediump float;
uniformとか
- attribute:頂点シェーダーで、プログラムから受け取る変数に指定します。
- uniform:頂点シェーダーやフラグメントシェーダーで、プログラムから受け取る変数に指定します。
- varying:頂点シェーダーで代入して、フラグメントシェーダーでそれを受け取る変数に指定します。
texture2D(handle, xy)
テクスチャのある座標上の色を取得する関数。
gl_FragColor
フラグメントシェーダーで、ピクセルの色を決定する変数です。ここにセットされた色が、そのピクセルの色になります。
以上をふまえてGPUImageのビルトインフィルタのシェーダプログラムを読むと、処理内容がグッと理解しやすくなりました。