
https://en.wikipedia.org/wiki/Computer_graphics_lighting

Unitiy나 Unreal Engine에서는 Point Light, Directional Light, SpotLight와 같이 다양한 Lighting Component들을 사용할 수 있다.
이러한 Lighthing Component들은 구현 시 아래에서 후술할 Lighthing Interatcion의 조합으로 이루어지는데 종류는 크게 3가지로 아래와 같다.
빛은 광원으로부터 올 수 있지만 그렇지 않은 경우도 존재한다, 오브젝트 자체가 빛을 가지고 있을 수 도 있다.(설령 그것이 눈에 보이지 않을지라도) 주변광이라고도 부르는 Ambient Lighting은 특정한 방향이 없으며 오브젝트를 덮고 있는 빛이다. 따라서 바라보는 각도나 세기에 관계없이 일정한 밝기와 색상으로 표현될 수 있다.
float ambientStrength = 0.1;
Vector3D ambientLight = ambientStrength * LightColor;
Vector3D ambientLightingResult = ambientLight * ObjectColor;

게임 엔진에서는 Directional Light와 같은 라이팅 컴포넌트를 사용하여 오브젝트에게 특정한 방향으로 광선을 쏴서 보다 효과적인 광원을 연출할 수 있다. 난반사라고도 부르는 Diffuse Reflection은 이와같은 연출을 구현하기위해서 사용된다.
Diffuse Lighting을 계산하기 위해서는 오브젝트의 Vertex가 가지고 있는 Normal Vector와 방향을 가지고 있는 광원의 위치, 그리고 그 위치에서 발사되는 광원의 벡터도 필요하다.
물체 표면에서 반사하는 빛의 양은 우리의 눈에 들어오는 빛의 벡터와 빛의 영향을 받는 표면의 법선 벡터가 이루는 각도의 코사인에 비례한다.
이 때 cosθ가 음수일 경우 값을 0으로 세팅한다.(법선과 광원이 반대로 향하기 때문)
벡터의 내적을 이용하면 두 벡터가 이루는 코사인값을 구할 수 있다.
Vector3D Normal = normalize(ObjectNormalVec);
Vector3D Light Direction = Normalize(Light Position - Fragment Position);
float temp = max(dot(Normal, Light Direction), 0.f);
Vector3D Diffuse = temp * LightColor;

광원이 오브젝트를 향해 빛을 쏜다면 그에 반사되는 빛도 볼 수 있을것이다. Specular Reflection은 이러한 특징을 이용한다.
오브젝트 표면의 법선 벡터를 알고있기 때문에 반사되는 벡터를 계산할 수 있다. 그리고 반사되는 벡터와 카메라 방향 사이의 거리를 알 수있는데 두 벡터간의 각이 가까울 수록(거리가 가까울수록) Specular Light의 강도는 강해질 것이다.
Vector3D View Direction = normalize(View Position - Fragment Position);
Vector3D Reflect Direction = reflect(-Light Direction, Object Normal);
float temp = pow(max(dot(View Direction, Reflect Direction), 0.0), Shininess);
Vector3D Specular = Strength * temp * lightColor;