※ 본 포스팅은 learnopengl.com을 번역 및 가감한 포스팅이며, learnopengl에서는 번역 작업 참여를 적극 장려하고 있습니다!
아래 링크에서 원문을 확인할 수 있습니다.
Colors
지금까지 색상을 사용하긴 했는데 제대로는 모르고 있었습니다. 이번에는 색상에 대해서 이야기해보고 조명을 어떻게 접근할지 알아봅시다.
현실에서 물체는 고유한 색상을 갖죠. 실상에서는 모든 색상을 가질 수 있지만 디지털 세계에서는 이 색의 범주가 어느정도 제한되어있습니다. 그래서 빨강, 초록, 파란색 세 색을 이용해서 RGB로 색을 표현합니다. 각각 [0,1]범위 내로 조합하면 거의 대부분 색은 표현 가능합니다. 예를 들어 코럴 색상은 이렇게 정의할 수 있습니다.
glm::vec3 coral(1.0f, 0.5f, 0.31f);
우리가 보는 색은 원래 물체의 색이라기 보단 빛이 물체에서 반사되어 눈에 들어온 색입니다. 물체에 흡수되지 않고 반사되어 우리 눈에서 인식되는 거죠. 태양의 빛은 모든 색이 결합해서 흰색으로 인지되는데, 이걸 파란색 물체에 비추면 파란색말고 다른 모든 색이 흡수되고 파란색만 반사합니다. 그 빛이 눈에 들어오면 파란색으로 인지하죠. 아래 이미지는 그 예시로 코랄색 물체로 표현한 것입니다. 각 색마다 반사되는 강도도 조금씩 다르네요.
태양빛은 모든 가시 광선이 있고, 이게 물체에 부딪히면 반사된 스펙트럼 색상의 조합들을 우리가 인지해서 코랄색으로 보이는 겁니다.
물리적으로는 사실 계산히 복잡하죠 그래서 자세한 것은 PBR(Physically Based Rendering)에서 다루게 됩니다.
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);
물체는 흰색 빛의 대부분 흡수하고 자신의 색상에 필요한 만큼 RGB 값을 반사합니다. 이제 물체의 색이 관원에서 각 RGB 성분을 얼마나 반사하는지 봅시다. 이번엔 광원에서 녹색 빛만을 써봅시다.
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' 카테고리의 다른 글
OpenGL Basic Lighting 조명 [Learn OpenGL 쉬운 번역] (16) | 2024.09.09 |
---|---|
OpenGL Lighting Scene 조명 씬 구현 [Learn OpenGL 쉬운 번역] (12) | 2024.09.08 |
OpenGL Camera Zoom 카메라 줌 [Learn OpenGL 쉬운 번역] (21) | 2024.09.06 |
OpenGL Camera Mouse Input 카메라 마우스 입력 [Learn OpenGL 쉬운 번역] (8) | 2024.09.05 |
OpenGL Camera Euler Angle 카메라 오일러각 [Learn OpenGL 쉬운 번역] (6) | 2024.09.04 |