RGB色空間


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 等)で成分に柔軟にアクセス