Back to top

LearnOpenGL(09) - Colors

작성날짜 2025/06/22

이전글: LearnOpenGL(08) - 카메라

다음글:


Colors


지난 챕터에서 간단하게 색을 다루어봤습니다. 하지만 아직 제대로 '색'이 무엇인지 정의하지는 않았습니다. 이번 챕터에서는 색이 무엇인지 이야기해보고 다음에 이어질 '빛' 챕터를 위해 씬을 구성하겠습니다.

실제 세상에서 모든 사물은 각자 고유의 색을 가지고 있습니다. 디지털 세상에서는 (무한한) 실제 색을 (한정된) 디지털 값으로 변환해야 합니다. 하지만 모든 현실의 색을 디지털적으로 표현할 수는 없습니다. 색을 디지털적으로 표현할 떄는 빨강, 초록 그리고 파랑 세가지 요소를 사용하며 흔히 RGB로 짧게 표현합니다. [0, 1] 범위의 3값의 조합을 사용하여 대부분의 색을 표현할 수 있습니다. 예를 들어, 산호색을 얻으려면 컬러 벡터를 다음과 같이 정의합니다:

glm::vec3 coral(1.0f, 0.5f, 0.31f);

실제 세상에서 물체의 색은 사실은 그 사물이 가지고 있는 색이 아닙니다. 그 색은 물체에서 반사된 색입니다. 물체에 흡수되지 않고 반사된 색을 우리가 인지하는 것입니다. 우리가 하얀색으로 인지하는 태양의 빛은 수많은 색들이 합쳐진 것입니다(이미지처럼요). 이 하얀 빛을 파란 장난감에 비추면 파란색을 제외하고 다른 색들은 흡수할 것입니다. 장난감이 파란색은 흡수하지 않기 때문에 파란색은 반사되고, 반사된 빛이 우리의 눈에 들어와 장난감이 파란색이라고 생각하게 되는 것입니다. 다음 이미지는 산호색의 장난감이 여러 색들을 각각 다른 세기로 반사하는 모습을 보여줍니다.

article_img_0_rte_image_55.png

하얀 태양빛은 여러 색의 집합이며 물체가 색들 중 대다수를 흡수해버리고 물체의 색을 표현하는 조합의 색을 반사합니다.

사실은 좀 더 복잡하지만 이 부분은 PBR 챕터에서 자세히 다룹니다.

색의 반사라는 규칙들을 그래픽 세상에 바로 적용해봅시다. OpenGL에서 광원을 정의할떈 광원의 색을 지정할 수 있습니다. 지금까지 하얀 빛을 예시로 들었으니 하얀 빛으로 하겠습니다. 광원의 색을 물체의 색상 값과 곱하면 물체에서 반사된 색(우리가 인식하는 색)이 될 겁니다. 우리의 장난감으로 돌아가서 그래픽 세상에서 인식할 색을 어떻게 계산하는지 살펴보겠습니다. 다음과 같이 빛과 물체의 색을 각 성분별로 곱하여 결과 벡터를 얻습니다.

glm::vec3 lightColor(1.0f, 1.0f, 1.0f);
glm::vec3 toyColor(1.0f, 0.5f, 0.31f);
glm::vec3 result = lightColor * toyColor; // = (1.0f, 0.5f, 0.31f);

장난감이 하얀 빛 중 상당수를 흡수하는 걸 볼 수 있습니다. 반사되는 건 빨강, 초록, 파랑 중 일부분뿐입니다. 실제 세상에서 빛과 색이 어떻게 작동하는지 보여줍니다. 물체의 색이란, 광원 중 반사되는 색 요소들의 총량입니다. 만약 하얀 빛을 초록색으로 바꾸면 어떻게 될까요?

glm::vec3 lightColor(0.0f, 1.0f, 0.0f);
glm::vec3 toyColor(1.0f, 0.5f, 0.31f);
glm::vec3 result = lightColor * toyColor; // = (0.0f, 0.5f, 0.0f);

이제 장난감은 흡수/반사할 빨강, 파랑의 빛이 없어졌습니다. 게다가 초록색 빛의 절반은 흡수하고 절반만 반사하고 있습니다. 우리가 보기에 장난감의 색은 어두운 초록색일 것입니다. 산호색의 물체가 갑자기 어두운 초록색이 됐습니다. 이번엔 어두운 올리브그린색 빛으로 한번 해보겠습니다.

glm::vec3 lightColor(0.33f, 0.42f, 0.18f);
glm::vec3 toyColor(1.0f, 0.5f, 0.31f);
glm::vec3 result = lightColor * toyColor; // = (0.33f, 0.21f, 0.06f);

보시다시파 광원의 색을 다르게하면 물체의 색이 다르게 보입니다.

색에 대해선 충분히 살펴봤으니 이제 실험용으로 쓸 씬을 구성할 차례입니다.


관련글

LearnOpenGL(07) - 좌표계LearnOpenGL(08) - 카메라
LearnOpenGL(09) - Colors
An unhandled error has occurred. Reload 🗙