Media Art ProgrammingWeek 03 · Period 01 Handout

p5.js / Media Art Programming

3주차 1교시 — 색상 체계: RGB, HSB, 투명도

Color and Repetition 주제의 학생용 강의 자료입니다.

WEEK 03 PERIOD 01 P5.JS MEDIA ART

3주차 1교시 — 색상 체계: RGB, HSB, 투명도

강의 아웃라인: week-03-outline 다음 교시: week-03-period2-student (for 반복문과 패턴)

항목 내용
대상 P5.js 입문자 (테크아트 전공)
소요 시간 45분
핵심 도구 P5.js Web Editor, 구글 Color Picker
학습 목표
  • RGB 색상 모드를 이해하고 fill()·stroke()·background()에 적용할 수 있습니다
  • alpha(투명도)의 원리를 이해하고 도형 겹치기·잔상 효과에 활용할 수 있습니다
  • HSB 색상 모드를 이해하고 RGB와 상황에 맞게 선택해 쓸 수 있습니다

도입

2주차 연결

지난 주에 마우스를 따라다니는 인터랙티브 캐릭터를 만들었습니다. 빨리 끝낸 사람은 이런 코드도 써봤습니다.

background(255, 220, 180, 30);  // 잔상 효과

여기서 마지막 숫자 30이 무엇인지, 이번 시간에 그 정체를 배웁니다.

그리고 지금까지 색상이라고 하면 fill(255), fill(0) 같은 흑백 위주였습니다. fill(255, 230, 200) 같은 건 알려준 숫자를 그대로 입력해봤습니다. 오늘부터는 원하는 색을 직접 골라서 쓸 수 있게 됩니다.

미디어아트 속 색상 — 다섯 가지 접근

미디어아트에서 색상이 얼마나 중요한지, 다섯 가지 다른 접근을 살펴봅니다.

① 흑백 / 미니멀 — Ryoji Ikeda, test pattern 데이터를 흑백 바코드 패턴으로 변환합니다. 색이 전혀 없는데도 압도적인 강렬함이 있습니다. RGB로 치면 (0,0,0)(255,255,255) 두 값만으로 이 모든 걸 만든 것입니다. 참고: test pattern (공식 사이트) · 영상 (Vimeo)

② 풀컬러 / 몰입형 — teamLab, Forest of Resonating Lamps - One Stroke 무라노 유리 램프 수백 개가 공간을 채우고, 관람객이 가까이 가면 하나의 색이 켜지면서 인접한 램프로 색이 퍼져나갑니다. 한 가지 색에서 시작해 그라데이션으로 변하며 공간 전체를 물들이는 모습은, 우리가 배울 HSB에서 H(색상) 값을 연속으로 변화시키는 것과 같은 원리입니다. 참고: 공식 사이트

③ 빛과 색의 인지 — Kimsooja, To Breathe — Coachella Valley (2025) 유리 건물 전체를 회절 필름으로 감싸서, 햇빛이 통과하면 무지개 스펙트럼으로 분해됩니다. 태양이 움직이면서 건물 색이 분홍에서 초록, 보라로 계속 바뀝니다. 백색광이 스펙트럼으로 나뉘는 것은, HSB 색상환에서 H를 0~360으로 변화시키는 것과 같은 원리입니다. 참고: Desert X 공식 사이트 · My Modern Met 소개

④ 인터랙티브 / 관객 참여 — Rafael Lozano-Hemmer, Pulse Topology (2024-2025) 수천 개의 전구가 천장에 매달려 있고, 관람객이 다가가면 심장박동이 감지되어 빛의 밝기와 리듬으로 변환됩니다. 새 관람객의 맥박이 추가될 때마다 가장 오래된 기록이 사라집니다. 생체 데이터를 빛으로 바꾸는 것은, P5.js에서 map() 함수로 센서 값을 색상·밝기에 매핑하는 것과 같은 원리입니다. 참고: 작가 공식 사이트 · Superblue Miami

⑤ 코드 기반 / 제너러티브 — Tyler Hobbs, Fidenza 하나의 코드 알고리즘에서 999개의 서로 다른 작품이 탄생합니다. 같은 코드인데 색상 팔레트만 바꾸면 완전히 다른 인상이 나옵니다. 파스텔 톤은 부드럽고, 원색 팔레트는 강렬합니다. 참고: 작가 기술 설명

오늘 배우는 RGB와 HSB를 자유자재로 쓸 수 있으면, 여러분의 작품이 표현할 수 있는 세계가 넓어집니다.


핵심 개념 1 — RGB 색상 모드

빛의 삼원색 — 가산혼합

컴퓨터 화면은 빨강(Red), 초록(Green), 파랑(Blue) 세 가지 빛을 섞어서 모든 색을 만듭니다. 이것을 RGB라고 합니다.

미술 시간에 배운 삼원색은 빨강·노랑·파랑이었습니다. 그건 물감의 삼원색(감산혼합)입니다. 물감은 섞을수록 빛을 흡수해서 어두워집니다. 빨강+노랑+파랑을 다 섞으면 거무튀튀한 갈색이 됩니다. 반면 컴퓨터 화면은 입니다. 빛은 섞을수록 밝아지는 가산혼합입니다.

물감 (감산혼합) 빛 (가산혼합)
삼원색 빨강, 노랑, 파랑 빨강(R), 초록(G), 파랑(B)
전부 섞으면 어두운 갈색/검정 흰색
아무것도 없으면 흰 종이 (밝음) 검정 (빛이 없음)
빨강 + 초록 갈색 비슷 노랑
핵심 포인트

(0, 0, 0)검정인 이유는 빛이 하나도 없기 때문이고, (255, 255, 255)흰색인 이유는 세 가지 빛을 전부 최대로 켰기 때문입니다.

왜 0~255일까?

컴퓨터는 모든 정보를 0과 1로 저장합니다. 8자리의 0/1(= 8비트 = 1바이트)로 표현할 수 있는 숫자가 0부터 255까지, 총 256가지입니다. 하나의 색상 채널에 1바이트씩 배정한 것입니다. 깊이 이해할 필요는 없습니다. 기억할 건 하나 — 0이 최소, 255가 최대.

fill(r, g, b) 기본 문법

각 색상 채널은 0~255 범위이고, fill(빨강, 초록, 파랑) 순서로 넣습니다.

function setup() {
  createCanvas(400, 400);
  background(240);
  noStroke();

  // 빨강
  fill(255, 0, 0);
  ellipse(100, 200, 80, 80);

  // 초록
  fill(0, 255, 0);
  ellipse(200, 200, 80, 80);

  // 파랑
  fill(0, 0, 255);
  ellipse(300, 200, 80, 80);
}

첫 번째 숫자가 빨강, 두 번째가 초록, 세 번째가 파랑입니다. 순서를 외우세요 — R-G-B.

색 혼합 예시

function setup() {
  createCanvas(400, 400);
  background(240);
  noStroke();

  // 빨강 + 초록 = 노랑
  fill(255, 255, 0);
  ellipse(80, 100, 70, 70);

  // 빨강 + 파랑 = 보라
  fill(255, 0, 255);
  ellipse(180, 100, 70, 70);

  // 초록 + 파랑 = 청록
  fill(0, 255, 255);
  ellipse(280, 100, 70, 70);

  // 전부 0 = 검정
  fill(0, 0, 0);
  ellipse(130, 250, 70, 70);

  // 전부 255 = 흰색
  fill(255, 255, 255);
  stroke(200);
  ellipse(230, 250, 70, 70);
  noStroke();  // 테두리 설정 복원
}

흰색 원은 배경과 구분되지 않아서 테두리를 넣었습니다. 모든 값이 255면 흰색, 모든 값이 0이면 검정입니다.

01 rgb additive mixing

stroke()background()에도 동일 적용

fill()만 색을 바꿀 수 있는 게 아닙니다. stroke()background()도 똑같이 RGB를 받습니다.

function setup() {
  createCanvas(400, 400);
  background(30, 30, 80);  // 어두운 남색 배경

  // 테두리 색도 RGB로 지정
  stroke(255, 255, 0);     // 노란색 테두리
  strokeWeight(4);         // 테두리 두께
  fill(100, 200, 255);     // 하늘색 채우기
  ellipse(200, 200, 150, 150);
}

채우기, 테두리, 배경 세 가지 모두 RGB로 제어할 수 있습니다.

fill() 인자 개수 정리

인자 수 형태 의미 예시
1개 fill(v) 회색 (0=검정, 255=흰) fill(128) → 중간 회색
3개 fill(r, g, b) RGB 색상 fill(255, 0, 0) → 빨강
4개 fill(r, g, b, a) RGB + 투명도 fill(255, 0, 0, 128) → 반투명 빨강

stroke()background()도 똑같은 규칙입니다. 인자 수에 따라 동작이 달라집니다.

구글 Color Picker

원하는 색의 RGB 값은 외울 필요가 없습니다.

  1. 구글에서 “color picker” 검색
  2. 색상 선택기에서 원하는 색 클릭
  3. RGB 값 확인 → 코드에 fill(R, G, B) 형태로 복사

전문 디자이너도 이렇게 합니다. 색상값이 필요할 때 이 도구를 쓰세요.

확인 질문

fill(0, 128, 255)를 쓰면 어떤 색이 나올까요?

: 빨강은 0, 초록은 중간, 파랑은 최대 — 밝은 하늘색입니다.


핵심 개념 2 — 투명도 (alpha)

alpha란?

RGB 뒤에 네 번째 숫자를 추가하면 투명도(alpha)를 조절할 수 있습니다. fill(255, 0, 0, 128)은 반투명한 빨강입니다.

alpha 값 의미
0 완전 투명 (안 보임)
128 반투명 (50%)
255 완전 불투명 (기본값)

alpha를 안 쓰면 기본값이 255입니다. 지금까지 fill(255, 0, 0)이라 쓴 건 사실 fill(255, 0, 0, 255)와 같았습니다.

02 alpha overlap and trail

반투명 원 겹치기

반투명 도형을 겹치면 빛이 섞이는 효과를 만들 수 있습니다.

function setup() {
  createCanvas(400, 400);
  background(240);
  noStroke();

  // 반투명 빨강
  fill(255, 0, 0, 100);
  ellipse(170, 180, 160, 160);

  // 반투명 초록
  fill(0, 255, 0, 100);
  ellipse(230, 180, 160, 160);

  // 반투명 파랑
  fill(0, 0, 255, 100);
  ellipse(200, 240, 160, 160);
}

세 원이 겹치는 가운데 부분을 보세요. 빨+초+파가 섞여서 밝은 색이 됩니다. 빛이니까 섞을수록 밝아지는 가산혼합입니다. alpha 값을 100 대신 50이나 200으로 바꾸면 겹치는 부분의 색이 달라집니다.

stroke()에도 alpha 적용

fill()뿐만 아니라 stroke()에도 alpha를 넣을 수 있습니다.

function setup() {
  createCanvas(400, 400);
  background(240);
  noFill();
  strokeWeight(6);

  // 반투명 테두리 원 여러 개 겹치기
  stroke(255, 0, 0, 80);
  ellipse(150, 200, 200, 200);

  stroke(0, 0, 255, 80);
  ellipse(250, 200, 200, 200);

  stroke(0, 180, 0, 80);
  ellipse(200, 140, 200, 200);
}

noFill()로 채우기를 없애고 테두리만 남기면, 선만으로 색이 섞이는 효과를 만들 수 있습니다. 올림픽 로고 같은 느낌입니다.

2주차 잔상 효과의 원리

2주차에서 background(255, 220, 180, 30)을 쓰면 잔상이 남았습니다. background()에 alpha를 넣으면, 매 프레임마다 반투명한 배경을 덮는 방식입니다. 완전히 지우는 게 아니라 살짝만 덮으니까, 이전 프레임의 그림이 서서히 사라집니다.

background() 설정 효과
background(220) 매 프레임 완전히 덮음 → 잔상 없음
background(220, 30) 매 프레임 살짝만 덮음 → 잔상 있음
background() 없음 안 덮음 → 이전 그림 전부 남음
확인 질문

fill(0, 0, 255, 0)을 쓰면 어떻게 될까요?

: alpha가 0이니까 완전 투명 — 그려도 아무것도 안 나타납니다.


핵심 개념 3 — HSB 색상 모드

RGB의 한계

RGB로 하늘색 fill(0, 100, 255)를 만들었다고 합시다. 이 색을 좀 더 어둡게 만들려면 세 숫자를 각각 얼마나 줄여야 할까요? 감이 잘 오지 않습니다. 파스텔 톤으로 바꾸려면 R을 올릴지 G를 올릴지도 막막합니다.

HSB 색상 모드는 이 문제를 해결합니다. ‘어둡게 하고 싶으면 밝기 숫자 하나만 줄이면 된다’ — 이렇게 직관적으로 색을 다룰 수 있습니다.

colorMode(HSB) 선언

HSB를 쓰려면 setup() 안에 한 줄만 추가합니다.

function setup() {
  createCanvas(400, 400);
  colorMode(HSB, 360, 100, 100, 255);  //  HSB 모드 전환
}

이 한 줄 이후로 fill(), stroke(), background()가 전부 HSB 기준으로 동작합니다. 숫자 네 개는 순서대로 H 범위(360), S 범위(100), B 범위(100), alpha 범위(255)입니다. 마지막 255를 넣어야 투명도가 RGB와 똑같이 0~255로 동작합니다.

H, S, B 각각의 의미

HSB는 색상환(Color Wheel)을 기반으로 합니다. 모든 색을 원형으로 배치한 것으로, 빨강에서 시작해 주황·노랑·초록·파랑·보라를 거쳐 다시 빨강으로 돌아옵니다.

03 hsb color wheel

H (Hue, 색상) — 0~360

색상환을 시계처럼 생각하세요. 0도부터 한 바퀴(360도) 돌면 원래 색으로 돌아옵니다.

H 값 색상
0 (= 360) 빨강
30 주황
60 노랑
120 초록
180 청록
240 파랑
270 보라
300 분홍

색상환의 구간별 분위기도 알아두면 좋습니다.

H 구간 분위기 대표 색
0 ~ 60 따뜻한 색 (warm) 빨강, 주황, 노랑
60 ~ 180 자연/차가운 전환 초록, 청록
180 ~ 270 차가운 색 (cool) 파랑, 보라
270 ~ 360 따뜻한 쪽으로 회귀 분홍, 마젠타

작품의 분위기를 정할 때 H 구간을 먼저 정하면 컬러 톤이 자연스럽게 잡힙니다.

S (Saturation, 채도) — 0~100

채도는 색이 얼마나 선명한지입니다. 100이면 원색 그대로, 0이면 색이 빠져서 회색입니다. 파스텔 톤을 만들고 싶으면 S를 낮춥니다. H는 그대로 두고 S만 바꾸면 같은 색 계열에서 톤만 달라집니다.

B (Brightness, 밝기) — 0~100

밝기는 밝고 어두운 정도입니다. 100이면 밝고, 0이면 항상 검정입니다. 어두운 분위기를 만들고 싶으면 B를 낮춥니다.

미술 용어와의 연결

미술 용어 의미 HSB에서는
Tint (틴트) 원색에 흰색을 섞음 S를 낮추면 됨 (파스텔)
Shade (셰이드) 원색에 검정을 섞음 B를 낮추면 됨 (어두운 톤)
Tone (톤) 원색에 회색을 섞음 S와 B를 함께 조절

미술에서 배운 개념이 HSB에서는 숫자 하나 바꾸는 것으로 그대로 옮겨옵니다.

HSB 색상 비교

function setup() {
  createCanvas(400, 400);
  colorMode(HSB, 360, 100, 100, 255);
  background(0, 0, 100);  // 흰 배경 (HSB에서 B=100)
  noStroke();

  // 같은 빨강, 채도만 다르게
  fill(0, 100, 100);  // 선명한 빨강
  ellipse(80, 100, 70, 70);

  fill(0, 60, 100);   // 중간 채도 빨강
  ellipse(170, 100, 70, 70);

  fill(0, 30, 100);   // 파스텔 빨강 (연분홍)
  ellipse(260, 100, 70, 70);

  // 같은 파랑, 밝기만 다르게
  fill(240, 100, 100);  // 밝은 파랑
  ellipse(80, 250, 70, 70);

  fill(240, 100, 60);   // 중간 파랑
  ellipse(170, 250, 70, 70);

  fill(240, 100, 30);   // 어두운 파랑 (남색)
  ellipse(260, 250, 70, 70);
}

위 줄은 빨강의 채도만, 아래 줄은 파랑의 밝기만 바꾼 것입니다. RGB로 하려면 세 숫자를 다 건드려야 하는데, HSB는 한 숫자만 바꾸면 됩니다.

HSB의 실용: 색상 팔레트 만들기

HSB의 핵심 장점은 같은 색 계열의 팔레트를 쉽게 만들 수 있다는 것입니다. H를 고정하고 S나 B만 바꾸면 됩니다.

function setup() {
  createCanvas(400, 400);
  colorMode(HSB, 360, 100, 100, 255);
  background(0, 0, 100);
  noStroke();

  // H=200(하늘색 계열)을 고정하고 S와 B 조합
  fill(200, 100, 100);  // 선명하고 밝은
  rect(20, 50, 70, 70);

  fill(200, 60, 100);   // 파스텔 밝은
  rect(110, 50, 70, 70);

  fill(200, 100, 60);   // 선명하고 어두운
  rect(200, 50, 70, 70);

  fill(200, 40, 80);    // 부드럽고 중간
  rect(290, 50, 70, 70);
}

H=200 하나만 고정했는데 네 가지 다른 톤이 나옵니다. RGB로는 이 규칙성이 보이지 않습니다.

RGB vs HSB

상황 RGB HSB
주황색 만들기 fill(255, 165, 0) — 외워야 함 fill(30, 100, 100) — 색상환 30도
파스텔 톤으로 바꾸기 R, G, B 각각 조절 — 감 필요 S만 낮추면 됨
어둡게 만들기 R, G, B 각각 낮추기 B만 낮추면 됨
무지개 만들기 각 색마다 R,G,B 직접 지정 H를 0~360으로 변화
04 rgb vs hsb palette

HSB가 항상 좋은 건 아닙니다. 정확한 색이 정해져 있을 때(브랜드 색상 등)는 RGB가 낫고, 색을 규칙적으로 변화시킬 때는 HSB가 훨씬 편합니다. 2교시에서 for 반복문을 배우면 H 값을 0~360으로 변화시켜 무지개를 코드 한 줄로 만들 수 있습니다.

구글 Color Picker에서 HSB 확인

Color Picker에서 색을 고르면 HSV 값도 표시됩니다. HSV는 HSB와 같습니다 (V = Value = Brightness). HSL이라는 비슷한 모드도 보이는데, P5.js에서는 HSB를 쓰니까 HSV 탭을 보세요.

확인 질문

HSB에서 fill(120, 100, 100)은 무슨 색일까요?

: H=120이니까 색상환에서 초록, S=100 선명, B=100 밝음 → 선명한 초록입니다.


예제

예제 1 — RGB ↔ HSB 같은 색 만들기

같은 색을 RGB와 HSB 두 방식으로 만듭니다.

function setup() {
  createCanvas(400, 400);
  noStroke();

  // 왼쪽: RGB 모드 (기본)
  colorMode(RGB, 255, 255, 255);
  fill(255, 100, 50);  // RGB로 주황 비슷한 색
  rect(0, 0, 200, 200);

  fill(100, 200, 255);  // RGB로 하늘색
  rect(0, 200, 200, 200);

  // 오른쪽: HSB 모드
  colorMode(HSB, 360, 100, 100, 255);
  fill(20, 80, 100);  // HSB로 주황 비슷한 색
  rect(200, 0, 200, 200);

  fill(200, 60, 100);  // HSB로 하늘색
  rect(200, 200, 200, 200);
}

왼쪽이 RGB, 오른쪽이 HSB로 만든 비슷한 색입니다. RGB는 숫자 세 개를 조합해야 하고, HSB는 색상환에서 각도를 잡으면 되니까 더 직관적입니다.

예제 2 — 반투명 겹치기

function setup() {
  createCanvas(400, 400);
  colorMode(HSB, 360, 100, 100, 255);
  background(0, 0, 95);
  noStroke();

  // 반투명 빨강, 초록, 파랑 원
  fill(0, 80, 100, 128);    //  alpha 128 = 반투명 (RGB와 동일한 0~255 범위)
  ellipse(160, 170, 180, 180);

  fill(120, 80, 100, 128);
  ellipse(240, 170, 180, 180);

  fill(240, 80, 100, 128);
  ellipse(200, 260, 180, 180);
}

겹치는 부분에서 색이 자연스럽게 섞입니다. 이런 효과를 만들 수 있는 것이 alpha의 힘입니다.

예제 3 — 구글 Color Picker로 색 찾기

원하는 색을 찾아서 코드에 적용하는 과정입니다.

  1. 구글에서 “color picker” 검색 → 색상 선택기 열기
  2. 원하는 색 클릭 (예: 산호색)
  3. RGB 값 확인: (255, 127, 80)fill(255, 127, 80) 입력
  4. HSV 탭으로 전환: 같은 색이 H=16, S=69, V=100인 것을 확인
  5. colorMode(HSB, 360, 100, 100, 255) 선언 후 fill(16, 69, 100) 입력
  6. 두 결과가 같은 색인지 비교

RGB든 HSB든 Color Picker에서 바로 값을 복사하면 됩니다.

언제 무엇을 쓸까
  • RGB: 숫자 세 개로 정확한 색 지정에 유리
  • HSB: 색의 변화(그라데이션, 무지개, 밝기 조절)에 유리
  • alpha: 겹침과 투명도 효과
  • Color Picker: 원하는 색의 값을 찾는 실용 도구

정리

1교시 핵심 요약
  1. RGB — 빨강(R), 초록(G), 파랑(B)을 각각 0~255로 조합. 빛의 삼원색
  2. HSB — 색상환(H, 0~360), 채도(S, 0~100), 밝기(B, 0~100). 색의 변화를 다룰 때 직관적
  3. alpha — 네 번째 인자로 투명도 조절. 0=투명, 255=불투명 (RGB·HSB 모두 동일)

2교시 예고

이제 색상을 자유롭게 다룰 수 있습니다. 2교시에서는 같은 코드를 수백 번 반복하는 for 반복문을 배웁니다. 반복문과 HSB를 결합하면 코드 3줄로 무지개를 만들 수 있습니다.