그래픽스/DX11

D3D11 Rasterization - Light

뽀또치즈맛 2024. 10. 30. 13:34

 

 

 

조명은 크게 3가지이다.

Direction light, Point light, Spot light

 

이를 코드로 나타내면 다음과 같다.

struct Light
{
    float3 Strength;
    float FalloffStart; // point/spot light only
    float3 Direction;   // directional/spot light only
    float FalloffEnd;   // point/spot light only
    float3 Position;    // point light only
    float SpotPower;    // spot light only
};

Directional light

태양같이 아주 멀리 있는 광원을 가정한다.
광원은 아주 멀리있다고 정의하기 때문에 광선들은 서로 평행한다.

Point light

Point Light는 점에서 사방으로 퍼져나가는 광원을 말한다.
대표적으로 전구가 있고, 이 광원이 어디있는 지가 중요하다.
광원이 움직이면 조명 효과도 같이 움직인다.

 

물체가 조명으로부터 멀어지면 점점 어두워진다.
점점 어두워지는 것을 수학, 물리적으로 푸는 것은 연산량이 많으므로
그렇게 중요한 요소는 아니었고, 멀어지는 현상이 느낌있게 되면 된다. 

 

falloffStart , falloffEnd 로 조명과의 거리를 수학적으로 나타낼 수 있다.

 

 

위 그림에서 falloffStart, falloffEnd를 추가해서 거리(d)가 멀어질수록 어둡게 만들었다.

즉 falloffStart로부터 지정해준 거리로부터 가까우면 조명의 세기가 1

falloffEnd로 설정해준 곳과 거리가 가까워지면 조명은 0의 세기가 된다.

 

이렇게하면 멀리있는 조명인 신경쓰지 않아도 되니 연산량을 아낄 수 있다.

 

falloffEnd를 값이 작으면 빛을 표현할 수 있는 거리가 짧아지는 것이고,

falloffEnd를 값이 크면 빛으로 표현할 거리가 넓어지는 것이다.

 

falloffStart의 값이 크면 올 수록 빛의 시작점이 짧아진다.

falloffStart의 값이 작으면 갈 수록 빛의 시작점이 길어진다.

 

빛의 거리가 어디까지 갈 것인가? 를 정하는 것이

falloffStart와 falloffEnd이다.

 

 

 

두 벡터의 방향에 따라 각도 90도를 넘는지,

두 벡터의 길이가 어떤지를 비교할 때 내적(dot product)을 사용한다.

 

빛이 한 곳으로 집중할 땐, power를 사용해서 계산을 한다.