헤더파일

HLSL 프로그래밍 - 포인트라이트, 스포트라이트, 캡슐라이트 본문

DirectX

HLSL 프로그래밍 - 포인트라이트, 스포트라이트, 캡슐라이트

헤더파일 2018. 3. 6. 13:20

포인트라이트

포인트 라이트는 디렉셔널 라이트에서 일정한 입사광 벡터값을 쓴 것과 달리 픽셀 셰이더에서 정점과 빛사이의 벡터를 매번 계산한다는 점과 거리에 따른 감쇠가 있다는 점이 다릅니다.



포인트 라이트는 전구처럼 사방으로 퍼져나가는 빛이므로 벡터값을 일일이 계산해줄 필요가 있습니다.

빛 벡터는 포인트라이트 위치 - 현제 월드공간 위치로 계산할 수 있고 

감쇠는 1.0 - saturate(빛까지의 거리 * 포인트 라이트의 최대 도달 거리의 역수)로 계산 할 수 있습니다. 거리가 작아질수록 감쇠는 1에 가까워져 적어집니다. 감쇠값은 최종 픽셀 색상에 곱해집니다.


스포트라이트


스포트라이트는 자동차 전조등처럼 빛이 원뿔형으로 나갑니다. 포인트라이트를 계산하는 방식에서 원뿔감쇠가 추가됩니다.



원뿔 감쇠는 원뿔의 안쪽 코사인값과 바깥쪽 코사인 값으로 계산합니다.


현재 스포트라이트의 코사인 값 = 내적( 스포트라이트의 진행방향 벡터 - 정점과 빛사이의 벡터)


 원뿔감쇠 값 = saturate(현재 코사인값 - 바깥쪽 코사인값) * 안쪽 코사인 값


현재 코사인 값이 내부 원뿔 코사인 값보다 클 경우 할상 1 을 반환해 빛이 최대가 되고 내부 원뿔의 코사인 값보다 작은 양수일 경우에는 감쇠영역에 위치하므로 각도에 크기에 따라 밝기를 낮춥니다.


캡슐라이트




캡슐모양의 광원으로 구조체에는 광원위치, 광원 범위의 역수, 광원의 방향, 캡슐의 길이, 광원 색깔을 받습니다.


내적은 한 벡터를 다른 벡터에 투영했을 때의 길이를 구한다. 백터 AP를 AB에 대입해 내적을 구하면 우리가 원하는 거리값이 나오게 된다. 이 값을 saturate 해서 0보다 작을 때는 0,, 1보다 클때는 1, 사이값일 때는 그대로 쓴다.

처리된 값에 다시 선분의 길이를 곱해주면 A로부터의 정확한 거리를 구할 수 있게 된다. 


이 거리 값을 캡슐 광원의 방향 벡터값에 곱해 캡슐 직선상의 위치를 구해서 그 값으로 픽셀과의 벡터값을 구합니다.

Comments