3D Graphics 및 Unity Engine 에서의 물체 색깔

3D 화면에서 물체의 표면 색상은 무엇이 결정지을까?

1_1circle_red

위쪽의 빨간색 공 이미지만 봐도 알 수 있는 것은 빨간색 공이 빨간색 만이 아니라는 것이다. 그림자 부분은 검은색도 존재하고 빨간색의 정도도 다양하게 형성이 된다. 즉, 3D 화면에서 빨간색 공이 제대로 그려지려면 공이 가지는 본래 색과 함께 빛의 영향력을 추가로 적용해서 최종적인 색깔이 나오게 된다.

3D Graphics에서 물체가 가지는 최종적인 색상을 이야기할 때 네가지로 구분한다.

Ambient Color
Diffuse Color
Specular Color
Emissive Color

먼저 Ambient Color는 환경에 산란하여 물체가 발하는 평균 색상 혹은 고정 색상이다. 그러므로 물체에 비치는 특정 빛에 의해서 영향을 받지 않고 모든 버텍스에 대해서 동일한 강도를 가진다. 이 색상은 물체의 모든 면에 닿는 강도가 같고 방향이 없다. 그래서 Ambient Color만 적용하여 렌더링한 물체는 아래 그림처럼 Flat한 2D Object처럼 보이게 된다. 그래서 Ambient Color를 물체가 빛을 받지 않는 영역인 어두운 쪽의 색상이라고도 한다.

1redball

 

반면, Diffuse Color는 하나의 방향성이 있는 빛에 의한 물체 표면의 색깔이다. 이 Diffuse Color는 빛의 방향과 물체의 Normal Vector와의 관계에 따라 색상의 강도가 달라진다. 즉 빛이 밝은 곳에서는 강한 Diffuse 색상이 나오고, 어두운쪽으로 갈 수록 약한 Diffuse 색상이 나온다. 이 Diffuse Color와 Ambient Color가 합쳐지면 우리가 평상 시에 보는 3D 공간에서의 물체의 색깔과 거의 흡사하게 된다.

Specular Color는 밝게 하이라이트 되는 부분의 빛의 색상이다. Specular Color는 물체의 Normal과 카메라, 즉 View Direction(보는 방향)과 연관되어 강도가 결정된다. Ambient, Diffuse, Specular Color를 합치면 사실적인 물체에 근접한다. <아래 Phong Reflection Model 그림 참조>

amb+dif_spec

추가로 Emissive Color가 있다. 위의 세 가지 타입의 빛의 색상과 달리 Emissive Color는 물체의 표면 속성 자체에서 뿜어 나오는 색상이다. 즉 외부 빛에 의한 색상이라기보다는 오브젝트 자체로부터 발산하는 Glow 색상이다. 실제로 빛을 발생하지는 않지만 빛이 발생하는 느낌의 색상이며 3D Graphics에서는 램프나 발광 물체, 큐브 매핑 등을 만들 때 쓴다.

유니티 엔진에서도 이와 거의 흡사하게 Material의 최종 색상을 계산하는 원리는 아래와 같다.  <참고>

즉 Ambient와 Emissive Color는 빛의 색상과는 관계 없는 색상이므로 Light Color에 영향을 받지 않고, 반면에 Diffuse와 Specular는 빛의 색상에 영향을 받는 색상이므로 빛의 색깔과 곱해준다. 그리하여 물체 표면의 최종적인 색상이 결정되는 것이다.

Unity Shader에서 Ambient Color는 Project에서 셋팅할 수 있고, Object 별로 Custom하게 먹일 수도 있다. 값은 UNITY_LIGHTMODEL_AMBIENT 라는 Shader Built-in 변수를 사용하여 접근한다.

그리고, Albedo(Diffuse)에 색상값을 주는 것과 Emission에 색상 값을 주는 것은 다른 결과를 준다. Unity Surface Shader 예제를 보면 단순 Texture의 색상을 먹이는 것은 아래 코드처럼 Albedo(Diffuse)에 그대로 적용 해 준 것을 볼 수 있다.

SurfaceShaderDiffuseTexture
반면 Rim Light의 경우에는 Emission에 값을 먹여서 발광 하도록 한 것을 볼 수 있는데, 이는 빛의 세기와 관계 없이 Rim 값이 일정하게 물체에 영향을 받게 하기 위한 셋팅이다.

SurfaceShaderRim
물체의 색상의 특징, 빛의 특징들을 잘 이해하는 것도 중요하고, 그것들이 조합되어 나오는 최종적인 색깔을 예상할 수 있는 것도 좋은 스킬이다. 그리고, Unity Shader를 다룰 때도 이 물체의 Material Color 특징들을 잘 이해하고 적절하게 이용하는 것은 매우 중요하다.