-텍스처를 원하는 위치에 띄우기
로더에서 원본 객체를 추가하고.
Terrain에 브러쉬용 텍스처 컴포넌트를 하나 추가해주자.
Shader_Terrain에 브러쉬를 저장하기위한 샘플러를 하나 선언해주자.
Terrain에 Render에서 Setup_TextureCOnstantTable함수를 이용해서 브러쉬 텍스처를 브러쉬 샘플러로 넘겨주자.
픽셀 셰이더에서 tex2D로 벡터를 만들고 이를 그대로 더해주면 마법진이 블렌드되어서 그려진다.
이제 원하는 위치로 띄어준다.
x,z와 값을 받아서 원하는 위치에서는 마법진이 올라간 그림을 그려준다.
그림을 그려주길 원하는 좌표를 vector g_vBrushPos로 받고
float g_fRange = 0.f로 변의 절반의 길이를 받아오자.
값비교를 위해 픽셀셰이더에서 vWorldPos를 받아와야한다.(g_vBrushPos가 월드위치로 넘어올것이기 떄문)
VS_OUT와 PS_IN은 같아야하므로 둘다 WorldPos를 추가해주자.
버텍스에서 In.VPosition에 월드행렬을 곱해서 Out.vWorldPos에 넘겨준다.
이제 vWolrdPos는 PS로 넘어가며 각픽셀인 선형보간된 월드좌표를 가지고있게 된다.
이렇게해서 픽셀의 위치를 받아왔다.
이제 값을 비교해주자.
g_vBrushPos.x - g_fRange < In.vWorldPos.x &&
g_vBrushPos.x + g_fRange > In.vWorldPos.x &&
g_vBrushPos.y + g_fRange > In.vWorldPos.y &&
g_vBrushPos.y - g_fRange < In.vWorldPos.y
Terrain에서 SetUp_ConstantTable로 g_vBrushPos와 g_fRange에 값을 던져주자
이제 사각형에 맞춰서 새로운 UV좌표를 만들어준다.
float2 vTexUV
vTexUV.x = In.vWorldPos.x - (g_BrushPos.x - g_fRange) / (2* g_fRange)
vTexUV.z = (g_BrushPos.z - g_fRange) - In.vWorldPos.z / (2* g_fRange)
조명
방향성광원은 모든 정점이 같은 방향으로 빛을 받고있다고 가정
한벡터를 뒤집어서 둘사이의 각도를 계산했을때 둘사이의 각도가 0도일경우 빛을 가장 많이 받는다고 할수있다.
Cos그래프와 같은 값을 가진다.
0도에서 최대값 ~90도까지 0으로 감사 90 ~270은 0 270~ 360까지 1로 상승
두 단위벡터의 내적은 둘사이의 각도이다.
이제 빛 구조체를 만들어서 장치에 set하는것이아닌 직접 셰이더를 통해 연산을 진행한다.
Light매니저와 Light구조체를 만든다.
06.Light필터를 만들고 매니저와 Light클래스 추가해주자.
Light
생성자의 인자로 장치를 받자(현재는 필요없지만 추후 필요하다)
빛정보는 D3DLIGHT9으로 정의할수 있다.이를 멤버변수로 가진다
Create의 인자로 LightDesc를 인자로 받아서 NativeCOnstruct의 인자로 넘겨줘서 멤버변수로 보관하게 해주자.
Get_LightDesc()를통해 빛정보를 전달할수있게 해주자
LightManager
빛마다 이름을 지어놓을필요까진없다 빛을 리스트로 보관하자.
외부에 노출하지않고 GameInstance를 통해서 접근할수있도록 싱글톤객체로 만들어주자.
list<class CLight*> m_Lights를 통해 빛을 보관한다.
Add_Light함수를통해 리스트에 빛을 생성해서 추가한다.
Get_Light를통해 빛을 반환해준다.
{
이터레이터를 통해 인덱스를 넘기고 해당하는 이터의 Get_LightDesc함수를 호출한다.
}
게임인스턴스에 라이트매니저와 함수들 추가해주자.
멤버변수로 m_pLightManager를 추가해주자.
겟라이트DEsc와 Add_Light와 추가해주자
라이트매니저가 장치를 들고있으니깐 장치를 지우기 전에만 제거해주자.
레벨_게임플레이의 Ready_Light()
라이트매니저에 빛을 추가해주자
지형셰이더
vector g_vLightDir에 빛의 광원벡터를 받아오자.
지형의 Render함수에서 g_vLightDir에 라이트매니저로부터 빛정보를 꺼내서 던져주자.
LightDesc의 Direction은 float3이다 4로 변환해서 주소값 넘겨주자.
정점단계에서 빛연산을 해보자 (고로 셰이딩)
빛벡터의 -1를 곱해 뒤집어주고 법선벡터까지 포함해서 정규화를 해주고 내적해주자.
saturate로 음수값은 날려주자.
빛은 월드좌표고 법선벡터는 로컬좌표다 법선을 월드좌표로 변환해주자.
fShade에 값을던져주자.
이를 픽셀셰이더에서 Out.vColor.rgb에 곱해주자.