d3dx9 - 21.10.29

김주현·2021년 10월 29일
0

d3dx9 3D

목록 보기
18/30

어제한것

1.플레이어 클래스 제작
2.플레이어의 원형 객체를 생성(로더 클래스에서)
3.레벨게임플레이 안에서 플레이어를 복제해서 레이어에 추가
4.플레이어의 텍스쳐 컴포넌트 추가
5.텍스쳐 컴포넌트는 한장 or 여러장이든 보관할 수 있는 형태로 제작
6.텍스처 컴포넌트 원형을 로더 안에서 컴포넌트매니저에 레벨
게임플레이에 넣었다.
7. 플레이어 안에서 복사본 컴포넌트를 생성했고 버퍼에 맵핑해서 그렸다.

백그라운드에도 텍스쳐를 올려주자

  • 백그라운드의 멤버변수로 텍스처컴포넌트를 추가(전방선어과 Free에서 릴리즈해주자)

  • Add_Components 함수안에서 멤버변수 텍스처컴포넌트에 컴포넌트를 복제해서 넣어주자.

  • 전에 사용한 텍스처는 게임플레이가 준비되며 생성했기때문에 사용할수 없음.

  • 레벨로고를 띄우기 전에 추가해놔야하므로 MainApp에서 LEVEL_STATIC에 추가해주자. Add_Prototype_Component에서 추가

  • 백그라운드의 Add_Components에서 위의 추가해놓은 원형을 통해 복제해서 백그라운드객체의 컴포넌트로 텍스쳐러를 추가해주자
    (게임오브젝에 맵으로 컴포넌트를 보관한 이유 : 다른 객체해서 참조해야할경우 게임 오브젝트의 맵을 통해 참조하기위해!)

  • 백그라운드의 Render에서 컬모드를 없애고 SetUp_OnGraphic_Device(0번째 아직 스테이지 구분 크게하지 않기로했음 ,0 1장임 디폴트값으로 0 안넣어도된다)
    (정점 버퍼에 텍스쳐좌표가 존재했기때문에 장치에저장되어있는 텍스처의 픽셀을 가져올수있었다.

*이후 실행하면 몬스터에 아무 처리도안했는데 그림이 들어간다. 백그라운드에서 장치에 그림을 올려놨고 이전에 저장한 텍스쳐 정보가 그대로있어서 그려진다.
(다른 텍스처를 주거나(setTexture의 인자를 0을주던가),VI버퍼에 UV좌표를 없애던가)

  • 백그라운드의 렌더에서 그릴때 뷰와 투영행렬을 변경해주겠다.
    월드,뷰,투영모두 항등행렬을 넘겨주면 원근감표현이 전혀안되고(원래 카메라가 위에서봐서 윗면이 조금길게 아랫면이 짧게),투영을 통해 정사각형으로 보였는데 다시 직사각형으로 보임,카메라 움직여도 이동하지않음(카메라 행렬 적용되지않음)

*월드,뷰,투영을 모두 수행하지않지만 윈도우 좌표로의 변환은 수행했다. 이를 무시하고 좌상단은 -0.5,0.5 우상단은 0.5,-0.5 로표현할수있다.(우리가 로컬스페이스에 지정한 좌표)
그럼와 너비와 높이가 딱 절반 만큼만 그려졌을까?
투영변환을 한뒤 -1,1 1,-1 점 사이에 픽셀등이 윈도우 화면 그려짐.
근데 우린 아무것도 안곱했으므로 좌상단은 -0.5,0.5 우상단은 0.5,-0.5 위치에있다 그래서 딱 절반의 크기로 그려진것.

화면을 꽉차게 그리고 싶으면 월드행렬을 2배 늘려주자.
스케일링 2배해주자.
이코드가 위험한 이유 : 뷰랑 투영을 레벨로고에서 틱마다 한번씩 세팅해줬음 하지만 이제 백그라운드가 뷰 투영행렬을 변경하니 몬스터가 이에 따라 그려질수있음
(게임인스턴의 틱에서 레벨매니저를 먼저해주자)
몬스터를 백그라운드보다 먼저그리면 상관없지만 백그라운드를 먼저그리면 레벨로고의 틱에서 장치에 올려놓은 뷰,투영행렬이 깨지게됨

해결 : 레벨로고에 뷰,투영 변환을 몬스터의 렌더에 추가해주자.
이렇게 계속 뷰랑 투영을 구하기 싫음

엔진에 파이프라인 클래스를 만들어서 뷰와 투영행렬을 보관하자.
카메라의 영향을 받고싶지않은 객체들(UI,맵)을 그릴땐 뷰랑투영을 항등으로 주고 특정행렬을 그릴때 이값을 변경해주고 싶다.

뷰랑 투영행렬을 미리 구해서 파이프라인에 저장해두고
객체를 그릴때마다 무조건 월드 뷰 행렬을 새로 적용해서 그리자.

레벨로고의 뷰,투영 구하는거 없애주자(카메라객체에서 만들어주겠음)

엔진에 파이프라인 클래스 구현

파이프라인클래스를 싱글턴으로 구성하고 뷰,투영행렬이 필요하면 바로 가져다가 사용하자!

  • 멤벼변수로 뷰,투영매트스를 보관하자.
  • Set_Transform함수의 인자로 D3D에 정의 행렬의 타입과 결과를 담을 매트릭스를 받자
  • eStateType이 뷰라면 뷰매트릭스에 받아온 매트릭스를 넣어주자.
  • Get_Transform를 통해 보관하고있는 두 행렬중에 하나를 리턴해주자.

카메라 객체를 만들어보자

엔진에 카메라의 부모클래스를 정의하고 클라에서 이를 상속받아 클라에서 필요한 기능들을 추가정의해서 클래스를 구성하자.

  • 게임오브젝트필터에 카메라 클래스를 구현해주자.

  • 카메라 클래스는 클라이언트에 있는 카메라 클래스의 부모이고 모든 카메라의 공통적인 기능을 보관하겠다.

  • 카메라의 틱을 무한호출해주기위해서 게임오브젝트의 형태로써 구현다.

  • 특정 레벨에 들어가면 필요한 원형 카메라를 만들고 이를 복제할것이다.

  • 생성자와 복사생성자에 이니셜라이저 추가.

클라이언트에서 우리가 사용할 카메라 클래스를 만들어보자

*게임 오브젝트의 필터에 카메라_Free 클래스 선언해주고 엔지에서 선언한 카메라를 상속받자.

*생성자와 복사생성자의 이니셜라이즈해주자

*Camera_Free의 원형을 만들고 복제하자!

*MainApp에서 프로토타입카메라프리를 통해 카메라_프리의 원형을 만들자.

*Level_GamePlay에서 카메라 객체를 만들어주자. Ready_Layer_Camera, 레벨이 초기화될때 카메라를 레이어에 추가해준다.
게임인스턴스를 가져오고 Add_GameObject()함수를 통해 원형을 복제하고 내가 원하는 레이어에 넣어주자
첫번째 인자 : 복제한 카메라를 어떤 레벨에 해당하는 레이어에 넣을것인지 LEVEL_GAMEPALT0
두번쨰 인자 : 원형객체의 태그 프로ㅗ타입 카메라 프리
세번쨰 인자 : 어떤 태그로 저장할것인지
네번째 인자 : 카메라에 대한 추가적인 정보

*엔진에 카메라 클래스로 돌아와서
멤버변수 CameraDesc를 선언해주자.
카메라가 어디에있는지,어디를 바라보는지등을 정의해주자
_float3 vEye // 카메라 위치
_float3 vAt // 카메라가 보는 점
_float3 vAxisY // y축

투영행렬을 구성하기위한 변수들
필드오브뷰 // 내카메라의 위아래각도
에스펙트 //윈도비율
니어 //0이아닌값 보이는 가장 작은값
파 //300즈음으로 주자 볼수있는 가장 먼값

이를 멤버변수로 보관할수있게 해주자

*다시 레벨 게임플레이에 레디 레이어 카메라로 돌아와서
CameraDesc를 선언해주고 구조체변수를 채워준다.
카메라 세팅을 완료했으면 함수의 네번째 인자로 넘겨주자.

*카메라 클래스로 돌아와서 네이티브컨스트럭트 함수 호출할때 아규먼트가 들어왔으면 memcpy로 복사해주자.

  • 현재 카메라의 상태를 기반으로 하여 만든 뷰, 투영행렬을 파이프라인에 저장하는 기능을 함수를 만든다.
    HRESULT Set_Transform();

뷰와 투영 매트릭스를 선언해주고
D3DXMatrixLookAtLH(뷰매트릭스 주소,카메라의 아이,카메라의 앳, 카메라의 엑시스와이)
이렇게 만든 뷰행렬을 파이프라인에 저장하자.

파이프라인을 자주 사용할것이기때문에 멤버변수에 보관해주자 생성자 복사생성자에서 이니셜라이저 해주고 레퍼런스 증가해주자.
Free에서 릴리즈해주자.

멤버변수 파이프라인에 셋트랜스폼으로 전달해주자.

D3DXMatrixPerspectiveFovLH(투영매트릭스 주소,필오뷰,에스펙트,니어,파)로 투영행렬을 만들고 셋트랜스폼함수로 전달해주자.

*이렇게 만든 셋트랜스폼 함수를 생성시에 한번 호출해주자(게임시작시 카메라값이 초기화되지않아서 이상한곳을 바라보는것을 막기위함

*카메라(부모)의 틱함수에서 Set_Transform을 계속해서 호출해주자.

  • 자식카메라의 Tick에서 이동을 입력받아 위치를 변경해주고 부모의 Tick을 호출해 행렬을 바꿔주자!

*레벨 게임플레이의 레디레이어 카메라로 돌아와서 CameraDesc의 나머지 인자들을 채워주자.

  • 게임인스턴의 파이프라인을 추가해주자.

  • 플레이어의 렌더에서 게임인스턴스를 받아와서 파이프라인으로 부터 값을 받아와 뷰와 투영행렬의 값을 채워주자.

  • 카메라프리의 틱에서 이동할수있게 해주자.

0개의 댓글

Powered by GraphCDN, the GraphQL CDN