PointLight 원형으로 불빛을 쏘는 형식이면
SpotLight는 손전등 처럼 원형으로 한쪽 방향으로 쏘는 느낌으로 볼수있다
그러면 우선 PointLight에 썼던 float4로만든 CalcPoint 함수를 복사해서 CalcSpot함수를
새로 만들어 준다. 구 모양으로 빛을 쏘는 PointLight에서 원뿔에 대한 부분에만 빛을 쏘는
각도를 두개를 주어 가운데 부분에 빛이 온전히 가는 부분 그리고 바깥쪽은 감쇠하는 부분으로 주고,
+ Directional에서 썼던 방향정보도 필요하다
GlobalBuffer헤더로 이동하여 안쪽 각도 inner와 바깥쪽 각도 outer를 주고
PixelHeader.hlsl의 Light 구조체에 추가해준다.
이제 밑으로 내려와 새로 추가해준 함수를 수정해준다
우선 dir 빛의 방향을 주고
cosAngle로 빛의 방향과 빛이 정점으로 가는 방향을 내적시킨다. 둘다 정규화된 값이다.
cos은 90에 가까울수 0이된다.
그렇기에 outer에 cos값을 넣어주고.
inner에 1.0을 / cos값을 넣어준다.
다음 conAttention 원뿔모양으로 감쇠하는 부분
선형으로 감쇠를위해 pow를 이용하여 제곱
그러고 구 감쇠와 같이 함께 적용해주면
바깥쪽과 안쪽이 잘 나오는것을 볼수있다.
이제 Light들을 여러개를 쓸려면 상수값을 주는데
Framework헤더에 define값으로 MAX_LIGHT 10 정도를 주고
globalbuffer헤더로 이동하여 값을 넘겨주고 ambientLight를 추가해준다.
Environment헤더로 이동하여 private로 EditLight함수를 하나 만들어준다.
다음 cpp로 이동하여 imgui를 추가
GUIRender에도 imgui를 추가
다음 PixelHeader.hlsl파일의 LightBuffer로 이동하여 count 추가하고
위에있는 Light 구조체에 어떤 라이트인지 구분을 위한 type변수와 isActive 변수 설정
Light.hlsl로 이동하여 반복문으로 lightcount만큼 반복하고
active가 꺼져있으면 넘어가고
켜져있으면 0 - Directional, 1 - CalcPoint, 2 - CalcSpot 설정을 해주고
GlobalBuffer로 이동하여 추가
다음 Envionment. cpp파일에 있는 GUIRender와 EditLight를 실행중 바꾸기위해 수정을해준다.
이제 실행을 해주면 이런식으로 빨강색과 파란색 빛 두가지를 같이 사용할수있게 된다.
spotlight는 저번에 만든 슈팅게임에 적용을 해주면 이런식으로도 사용 가능하다
'학원' 카테고리의 다른 글
DirectX 3D ModelRender (0) | 2023.11.08 |
---|---|
DirectX 3D ExportMaterial (0) | 2023.11.08 |
DirectX 3D PointLight (0) | 2023.11.07 |
DirectX 3D DirectionalLight (0) | 2023.11.07 |
DirectX 3D ShootingGame(1) (1) | 2023.10.30 |