グリッドシェーダ

グリッドシェーダ

グリッド状の線を表示するシェーダです。

shaderの作成

 頂点座標を用いてグリッドの表示を行います。vertex shaderから頂点座標をそのままfragment shaderへ渡します(o.pos)。

vertex shaderから渡された頂点座標を用いて、グリッドの描画を行います。ここでは、x方向のみを扱います。

これを実行すると

(Edge=0)

となります。_Edgeの数値を大きくすると

(Edge=1)

このように、境界がぼやけます。つぎに、グリッドの大きさを調整できるように処理を変更します。frac(i.pos.x)とすることでsmoothstepの入力値が0~0.999・・・を繰り返すようになります。さらに、_GridSizeをi.pos.xにかけることにより、グリッドの大きさを任意に変更できるようになります。

(GridSize=0.5, Edge=0.3)

あとはグリッド線の太さですが、0.5としている部分が太さを決める部分となります。よって、

とすると、任意に線の太さを変更できるようになります。

(GridSize=0.5, LineWidth=0.7, Edge=0.3)

上画像を見てわかるように、線の片側しか表示できていません。そこで反対側も表示できるように変更します。

これを実行すると

(GridSize=0.5, LineWidth=0.7, Edge=0.3)

となり、反対側も表示されるようになりました。さらに、横線を表示できるように変更します。

(GridSize=0.5, LineWidth=0.7, Edge=0.3)

平面ではこれで十分ですが、立体的なオブジェクトで使用できるよう上記コードを以下のように変更します。

(GridSize=5, LineWidth=0.93, Edge=0.05)

立体にグリッドを表示することができました。しかし、一つ問題があります。

問題点と解決方法

 GridSizeを6へ変更すると

(GridSize=6, LineWidth=0.93, Edge=0.05)

このように真っ白になってしまいます。この現象は、線がエッジの部分に重なった場合なるようです。xのみに変更すると

(GridSize=6, LineWidth=0.93, Edge=0.05)

となります。この画像より、i.pos.xが同じ頂点で囲まれている面が白くなっていることが分かります。そこで、fwidthを使用してマスキングを行います。fwidthは入力値がどれだけ変化しているかを返してくれます。よって、

とすることで、fwへi.pos.xの変化がほぼない場合は0を、それ以外は1を代入することができます。fw を出力してやると

となり、i.pos.xに変化がない場所は黒(fw =0)、他の部分は白(fw =1)となっていることがわかります。これをグリッド線の式に乗算してやれば、問題が解決するはずです。

これを実行すると

(GridSize=6, LineWidth=0.93, Edge=0.05)

となり、問題が解決しました。このコードを3次元にしてやると

(GridSize=6, LineWidth=0.93, Edge=0.05)

となり、正常にグリッド線が表示されるようになりました。

shader

 テクスチャ、グリッド線の色及び基本色を変更できるようにしています。

実行結果

 上記shaderの実行結果は以下の通りです。