はじめに
glslでは定数を定義するのにdefineを使う方法とconstを使う方法がありますが両者共明確に異なるので、それぞれの用途について解説します。
define
defineはマクロ的に展開される。つまり文字列が置換されて展開される。
const
constは定義時に実際に値が計算される。
具体例
両者の違いを具体的に見ていきましょう。
具体的には、defineでPIが設定してあった場合
#define PI 3.141592653589793
#define PI2 PI * 2.
float r = (atan(p.y, p.x) + PI) / PI2;
というのはマクロ的に展開されてしまって
float r = (atan(p.y, p.x) + PI) / PI * 2.;
の場合意図した計算にならない。
const float PI = 3.141592653589793;
const float PI2 = PI * 2.;
の場合は、PI2の定数として参照される。
float r = (atan(p.y, p.x) + PI) / PI2;
それぞれの使い道
defineの場合単なる文字列置換であり、上記のような事故が起こるので、なるべくPIなどの定数はconstを使った方がいい。
defineの方は、glslの文法関係なく、自由に置換したい文字列を定義できるので、短い関数の定義などはとても便利
#define saturate(a) clamp( a, 0.0, 1.0 )
これも、実際にはマクロ的に展開されているってことになります。
つまり、glsl的にはsaturate関数というユーザー定義関数は定義されていない。
saturateの場合はこっちの方が良さそうです。