その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

『フラグメントシェーダー事始め』で勉強したメモ

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のビルトインフィルタのシェーダプログラムを読むと、処理内容がグッと理解しやすくなりました。