DX 에서 쉐이더로 조명을 나타내기
조명을 비추었을 때, 스펙큘러는 카메라의 View 벡터의 영향을 받지만 그 외 기초 조명은 영향을 받지 않는다.

시점을 변환했을때 조명은 계속해서 오브젝트를 비추고 시점을 따라가지 않는다. (스펙큘러 아님)

스펙큘러는 시점 따라 조명이 따라옴!

hlsl 파일은 include 가 가능하다. 그래서 공통으로 사용할 데이터 형식을 정의 해두기도 한다. 이 쉐이더는 main 이 따로 없다. 이유는 VS,PS 처럼 뚜렷한 실행 목적이 있는 쉐이더가 아니라서 빼버린 것이다.
(float 이 중간에 껴서 16바이트 기준으로 잘라 gpu 가 데이터를 문제 없이 읽도록 설정했다.)

여기서 Item Type 을 변경해주면 main 없이 사용 가능한 프로그램이 된다.

기본적인 쉐이딩은 조명 개수를 고정 시켜 놓는것이 현실적이다. 장면 설계 시 미리 조명을 정해두어 최적화하고 동적인 조명이 필요하면 라이트 맵과 같은 기법을 사용한다.

쉐이더는 early return 을 좋아하지 않는다. if 쓸거면 else 꼭 쓰자.

텍스처링과 회전 조명 쉐이딩에 맞게 구조체를 변경.

Vs 코드를 보면 노말 회전을 위한 Transpose 를 추가했다.
main 함수에서는 월드 위치들을 따로 저장해주는데 조명은 월드 좌표 기준으로 계산하기 때문에 NDC 좌표로 변환되어지기 전에 미리 월드 위치들을 저장해서 ps 로 보내주면 ps 는 이 월드 좌표로 색을 변경한다.
노멀은 Transpose 를 곱해주어 회전을 적용시켜준다.

input.posWorld 나 norbalWorld 를 이용해서 색을 결정한다. 월드 기준으로

여기서 for 문을 사용하는데 UNROLL 은 최적화 나열을 의미한다. 컴파일러 에게 for 문의 반복만큼 코드를 나열하라는 의미이다.
LOOP 은 최적화를 끄고 for 문을 그대로 사용하라는 의미이다.
쉐이더는 if 문을 잘안쓴다. 안쓰는게 더 효율적임 그래서 모든 라이팅을 연산하는데 대신 cpu 가 쉐이더로 데이터를 보낼때 밝기 값을 0으로 만들어 보내주면 * 0 되어져 해당 조명을 사용하지 않는다.