9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

はじめに

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の場合はこっちの方が良さそうです。

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?