title: "RGB色空間" description: "RGBカラーモデルの基礎を学びます。vec3/vec4を使った色の表現と、各チャンネルの操作方法を理解します。" chapter: "02-colors" order: 1 challenge: description: "画面を4つの象限に分け、左上を赤、右上を緑、左下を青、右下を黄色に塗り分けるシェーダーを作ってください。" hints:
- "uv.x と uv.y がそれぞれ 0.5 より大きいか小さいかで4つの象限を判定できます。"
- "step(0.5, uv.x) は uv.x が 0.5 以上なら 1.0、未満なら 0.0 を返します。"
- "左上: vec3(1,0,0), 右上: vec3(0,1,0), 左下: vec3(0,0,1), 右下: vec3(1,1,0) です。if文で分岐するか、step と mix を組み合わせましょう。"
RGB色空間
デジタルカラーの基礎
コンピュータのディスプレイは、赤(Red)、緑(Green)、青(Blue) の3つの光を混ぜ合わせてすべての色を表現しています。これがRGB色空間です。
絵の具の色混ぜ(減法混色)とは異なり、光の色混ぜ(加法混色)では:
- 赤 + 緑 = 黄色
- 赤 + 青 = マゼンタ
- 緑 + 青 = シアン
- 赤 + 緑 + 青 = 白
vec3 で色を表現する
GLSLでは vec3 を使ってRGB色を表現します:
vec3 red = vec3(1.0, 0.0, 0.0);
vec3 green = vec3(0.0, 1.0, 0.0);
vec3 blue = vec3(0.0, 0.0, 1.0);
vec3 white = vec3(1.0, 1.0, 1.0);
vec3 black = vec3(0.0, 0.0, 0.0);
全成分が同じ値の場合は、引数を1つにできます:
vec3 white = vec3(1.0); // vec3(1.0, 1.0, 1.0) と同じ
vec3 gray = vec3(0.5); // 50%グレー
色の演算
GLSLでは、ベクトル同士の演算が成分ごとに行われます:
vec3 a = vec3(1.0, 0.5, 0.0);
vec3 b = vec3(0.0, 0.5, 1.0);
vec3 added = a + b; // vec3(1.0, 1.0, 1.0) — 白
vec3 scaled = a * 0.5; // vec3(0.5, 0.25, 0.0) — 暗くなる
vec3 multiplied = a * b; // vec3(0.0, 0.25, 0.0) — 色のマスク
色にスカラー値を掛けると明るさが変わり、色同士を掛けるとマスク(フィルタ)のような効果が得られます。
swizzling で成分にアクセス
rgb の記法で個別の成分にアクセスできます:
vec3 color = vec3(0.8, 0.4, 0.2);
float r = color.r; // 0.8
float g = color.g; // 0.4
float b = color.b; // 0.2
vec3 redOnly = color.r * vec3(1.0, 0.0, 0.0);
clamp で範囲を制限
色の演算結果が 0.0〜1.0 の範囲を超えることがあります。clamp 関数で安全に制限しましょう:
vec3 color = clamp(someCalculation, 0.0, 1.0);
まとめ
- RGB色空間は光の3原色(赤・緑・青)で色を表現
vec3でRGB、vec4でRGBAを扱う- ベクトル演算で色の加算・乗算が可能
- swizzling(
.rgb等)で成分に柔軟にアクセス