본문 바로가기
학원

DirectX 3D ModelRender

by Srff5123 2023. 11. 8.
728x90

Material과 Texture를 뽑았으니 이제 Mesh Data를 뽑을 차례이다.

 

 

Mash에도 이름이 붙기때문에 String으로 name저장을 해주고,

Mesh같은 경우에는 여러개로 나뉘어져 있기 때문에(Mertarial을 여러개 붙여주기 위함)

그래서 Mash 정보에는 materialIndex선언

 

다음 생성을위한 vertices와 indices 설정해주고

 

ModelExporter.h로 이동하여 Mesh함수 만들어주기

binary로 받는 것이 좋기 때문에 ReadMesh를 해주는데 node는 트리형태로 뽑아줌

다음 WriteMesh 만들고 vector로 Meshdata 만들고 cpp에 함수 선언하고

 

cpp로 이동하여 만들어준 함수 작성 

 

Mesh의 갯수만큼 반복

meshdata 생성해주고

mesh에서 node를 통하여 이름을 뽑아주고

원본 data 뽑아주기

memcpy로 데이터 받아 정점 찍어주기, memorycopy

TextureCoords  - UV값 

Normals - 법선값 

TangentsAndBitangents - tangent값

 

필요한 데이터를 다 뽑아내어

vertices 찍어주기

 

다음 indices 찍기

 

NumFaces - 폴리곤 정보, 3개 들어가기떄문에 * 3

폴리곤 갯수 만큼 반복해주고

indices뽑아주고

 

meshes에 pushback을 해줌

 

다음 node는 bone) 뼈에 해당되는데 애니메이션을 만들떄 필요한 몸의 뼈대라고 생각하면

된다. 각각의 노드 마다 골반 - 척추 - 머리 이런식으로 상속이 되어 연결되어 뼈를 움직이면

Model이 같이 움직인다. 서로 상속된 node형태로 전부 읽어와야 하기 때문에

재귀 함수를 이용하여 Node탐색을 한다.

 

다음 테스트를하여 잘 뽑혔는지 호출하여 디버깅

이런 식으로 잘 읽어오는것을 확인할수있다. 

 

다음 모델을 뽑을때 의미없는 데이터들을 줄여준다.

ModelExporter생성자로 이동하여

importer로 (AI_CONFIG_IMPORT_FBX_PRESERVE_PIVOTS) 쓸모없는

PIVOT을 제거 해준다.

 

그다음 다시 디버깅하여 잘나오는지 확인한다.

 

이제 저장을 위해 WriteMesh함수 작성하는데

 

binary로 저장을하고 캐릭터 이름으로 저장하는데 mesh는 파일을 여러개 할 필요가없어

전부 다 하나로 밀어넣어준다.

다음 CreateFolders불러오고

반복문 이용하여 읽어온 데이터들을 순서대로 저장해주고

디버깅 하여 테스트하여 잘 저장되는지 확인을 해주고

 

이제 저장한것을 읽어 화면에 모델 출력하기 위해 새로운 ModelRenderScene.h 생성

하고, 다음 cpp 생성하여 model넣어주고

 

 

 

GameManager.cpp에 호출하고,

 

Model.h 생성

 

public으로 model생성할 때 필요한 이름과, 소멸자 Render, GUIRender, setShader

받아주고

 

protected로 멤버변수 만들어줌

name ,materials , meshes, 세개를 통제한 worldBuffer 

 

이제 cpp로 만들어줌 생성자에서 이름 받고 Material과 mesh읽어줄 함수와

worldBuffer

 

소멸자에서는 material과 mesh들 반복문 통해서 한번에 지우고,

worldBuffer도 delete해주기.

 

다음 Render에서 

worldBuffer 세팅해주고

mesh들 Render

 

GUI에서 재질 조정할 material Render

 

가지고 있는 모든 Material Shader 세팅

 

다음 ReadMaterial로 저장된 model경로를 통해서 읽어오고

BinaryReader에 넣어주고.

조건문 이용하여 경로 잘못됐을시 assert이용하여 멈추기

다음 size에 material의 갯수 넣어주고

반복문 통하여 Material 로드하여 생성하고

push_back으로 넣어주고

다 뻇으면 reader delete

 

다음 Mesh읽어오기 위의 코드 복사하여 붙여주고 수정

 

ModelMesh.h도 생성

이름 매개변수로 받고, Vertices랑 indices를 가질거라서 Render함수 받고

CreateMesh Mesh를 생성할 때 필요한 정보들 매개변수로 받기

다음 SetMaterial로 Material 참조

하나의 mesh에는 하나의 material을 가지기 때문에 material, mesh 받기

 

cpp파일 만들어주고, 소멸자에서 mesh delete해주고

 

Render에서 material과 mesh 세팅

다음 CreateMesh에서

mesh를 ModelVertex로 만들어주고

Getvertices로 vertexcount 만큼 resize로 미리 공간 잡아주고

memcpy로 이용하여 vertices와 indices정보 넣어줌

필요한 정보를 다 뽑아서 CreateMesh

 

이제 모든 정보를 다 뽑아 읽어서 생성했고 테스트하면

이런식으로  다운받아온 모델링파일이 월드에 잘 생성이 되는것을 볼 수 있다.

728x90

'학원' 카테고리의 다른 글

DirectX 3D LayCollision Box  (1) 2023.11.09
DirectX 3D Box Collision  (3) 2023.11.09
DirectX 3D ExportMaterial  (0) 2023.11.08
DirectX 3D SpotLight  (0) 2023.11.08
DirectX 3D PointLight  (0) 2023.11.07