Help us understand the problem. What is going on with this article?

glsl constとdefineの違い

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away