카메라 회전
좌우회전을 구현할때 회전축을 Y축으로할것인지 업벡터 기준으로 할것인지 결정해야한다(게임 컨셉의 문제)
축을 Y축으로 두고 세번째인자는 타임델타에 * 마우스 무브를 곱해주자.
카메라위치의 값을 0으로 수정하자.
상하회전은 카메라의 Right축을 기준으로 회전하게 해주자.
카메라를 고정해주고 싶으면
Tick에서 SetCursorpos를 호출해주자
스크린 좌표를 받으므로 해상도의 절반을 ScreenToClient로 스크린 좌표계로 변경해주자.
인덱스 버퍼
현재 사각형을 그릴때 버텍스를 6개찍어서 2개가 중복되고있음
버텍스버퍼배열 : 4개의 버텍스가 저장되는 배열의 형태가 될것
순서대로 배열에 정점이 할당될것
여기서 버퍼를 하나더 만듬
인덱스버퍼(정점의 인덱스를 보관하고있다)를 하나 만들어서 버텍스 버퍼의 점을 넣어주자!
장점 : 중복된 버텍스를 안만들어줘도됨
인덱스 버퍼를 사용하면 렌더를 변경해줘야함
DrawPrimitive가 아닌 SetIndices()로 인덱스버퍼를 장치에 세팅한다.(인덱스 버퍼를 장치에 묶을걸)
SetIndices(인덱스버퍼)
DrawIndexedPrimitive()로 그려주자!
인덱스버퍼는 6칸을 버텍스버퍼는 2칸을 쓰는데 버텍스가 더유리한거아닌가? - 아니다. 인덱스버퍼는 버텍스버퍼의 주소를 저장한다.(16비트 or 32비트)(16비트 최대값 65535 정점을 65535개미만이면 16비트로 넘어가면 32비트)
삼각형만을 그릴때는 굳이 인덱스버퍼를 사용안해도된다.
구현
VI버퍼의 헤더에 멤버변수로 인덱스 버퍼를 생성해주자.
렌더VI버퍼에서 함수를 수정해주고
VI버퍼_렉트에서 인덱스 버퍼를 선언해주자.
중복되는 버텍스 3번 4번을 없애주자.
네컨_프로토에서 버텍스 버퍼를 만드는 작업을 하고있었음
생성한다음
CreateIndexBuffer()함수를 호출해주자
자식에서 달라지므로 인덱스 버퍼관련정보를 멤버변수로 보관하자.
인덱스 버퍼에는 정수가 담겨야함.
_uint m_iNumPrimitive //그리고자하는 도형의 갯수
_uint m_iNumVerticesPerPriimve //도형당 인덱스의 갯수
_uint m_iOneIndexSize = 0; // 인덱스 하나의 사이즈 (정점이 6만개 넘어가면 4 아니라면 2;
_uint m_dwIBusage = 0 //용도 0을 넣어주자.
_uint
이를 채워주자.
다시 CreateIndexBuffer()함수로 돌아와서
1번인자 : m_iNumPrimitive*m_iNumVerticesPerPriimve 총인덱스 버퍼의 갯수 -> 바이트를 넘겨줘야함 인덱스 하나의 크기를 곱해주자
CreateIndexBuffer(인덱스의 개수,용도,포맷(D3DFMT_INDEX16),D3DPOOL_MANAGED,&m_pIB,nullptr);
이제 인덱스 버퍼의 값을 채워주자.
2바이트니깐 _ushotr으로 nIndices를 선언해주자
m_IB의 LOCK(0,0,(void**)&pIndices,0) 과 UNLOCK을 호출해주자.
pIndices는 메모리공간의 첫번째 주소를 의미한다.
다음 pIndices에 시계방향으로 값을 채워준다.
다음 언록을 해준다.
이제 렌더로 이동해서 인덱스 버퍼를 이용하여 그려주자.
DrawIndexedPrimitive(기존의 프리미티브타입,0,내가 사용하고 있는 가장 작은 정점의 인덱스(0),정점 몇개사용하는지,어떤 인덱스부터 사용하는지(0),도형갯수 몇개인지);
VI버퍼의 복사생성자에서 새로 만든 멤버변수들을 복사해주자.
Add_ref와 Safe_Release도 해주자.
지형을 추가해보자
클라이언트의 게임 오브젝트 필터에 Terrain필터를 추가해주자.
터레인 클래스를 추가해주자.
터레인에 어떤 컴포넌트가 필요할까? - 트랜스폼,렌더러,텍스처,VI버퍼(지형을 구성하기위한 버퍼를 만들어주자!)
컴포넌트를 추가하기위한 Add_Components를 함수를 구현해주자.
부모의 Add_Component를 호출해서 각 컴포넌트를 추가해주자.
기존의 타일 처럼 100개를 깔아버리면 프레임드랍이 엄청 심해짐
그냥 버텍스 버퍼에 정점을 400개를 넣어버리면된다.
위는 드로우 100번호출 아래는 1번 호출
이를 인스턴싱이라함 중복된 사전작업에대한 호출이 너무 많이 일어날때 이를 버퍼에 담아 한번에 처리
텍스처의 원형을 추가해줘야한다. 로딩클래스에서 텍스처 원형을 추가해주자.
다시 돌아와서 텍스처 컴포넌트를 추가해준다.
엔진에 VIBuffer_Terrain을 추가해준다.
복사해준후 이제 지형을 만들기위한 데이터를 추가해줘야한다.
카메라의 가장 앞에있는 정점을 0,0,0으로 두자.
x값은 오른쪽 z값은 멀어질수록 커짐 일단 y값은 고정
버퍼의 크기는 2의 n승 +1로 할거 반으로 나눴을때 딱 나눠지도록 처리하기위함.
버퍼를 채우기위한 정보 : 몇개의 정점을 찍을것인지, 정점간의 거리는 몇인지(로컬스페이스상 1로 하겠음)
버퍼터레인의 Create를할때 가로정점개수와 세로 정점개수 정점간의 거리(디폴트 1)를 얻어오자.
이인자값들은 네컨_프로토로 그대로 전달됨
이제 정점의 개수를 알수있으니 네컨 프로토타입에서 값을 넣어주자.
삼각형의 갯수는 가로세로 갯수 -1 *2이다.
인덱스 버퍼사이즈도 4로 해주자.
정점의 위치를 넣어주는건 반복문을 통해 넣어주자.
i는 행을 담당 j는 열을 담당.
버텍스에 값을 채워주자.
포지션 - xz값은 인터벌만큼 증가 y는 0으로 고정
UV좌표 - 시작점이 0,0 마지막이 1,1
인덱스버퍼에는 우상단 좌하단 삼각형을 그려나가면됨
반복문을통해 인덱스버퍼에 버텍스버퍼의 값을 넣어주자.
인덱스용 변수 iVertexIndex를 만들어주자 0부터 순차적으로 증가하면서 이값이 늘어나면서 인덱스를 결정한다.
지형 객체는 LevelGamePlay에서 레디레이어_백그라운드 함수를 만들어서 추가해주자.
지형 원형은 레벨 로딩에서 만들어준다.
레벨로딩에서 Terrain 헤더를 추가해주고.
Terrain의 원형을 추가해주자.
VI버퍼터레인도 추가해주자.
(VI버퍼터레인을Create해서 넣어준다.인자(장치,가로갯수,세로갯수)
컴포넌트에 VI버퍼 터레인을 추가해준다.
레벨겜플-네컨에서 - 레디레이어백그라운드 해주자.
터레인의 컴포넌트 추가해서 VI버퍼컴퍼넌트에 추가를해주자.
터렌에서 렌더그룹추가해주고
월드,뷰,투영(파이프라인에서 꺼내온다)에서 세팅해주자.
렌더함수에 렌더VI버퍼 해주자
셋업 온그래픽 디바이스로 텍스처를 올려주자.