Mesh_Dynamic 정리

김주현·2021년 12월 7일

셰이더

목록 보기
11/18

흐름

  1. Mesh_Dynamic의 Create->Native_Prototype호출

szFullpath에 인자로 받은 경로를 붙임
하이어라키로더를 만들고 D3DXLoadMeshHierachyFromX함수호출
(내가만든 하이어라키로더로 데이터를 읽어오고 루트프레임에 저장해줌)

  1. D3DXLoadMeshHierachyFromX
  1. 먼저 CreateFrame함수를 통해 프레임을 만듬
    여기서 원하는 LPD3DXFRAME을 상속받아 원하는 구조체로 데이터를 불러올수있다.
    나는 CombinedTransformationMatrix를 사용해서 루트부터 누적된 이동행렬을 가지게함 이를 곱하면 진짜위치를 구할수있다.

    먼저 읽어온 Name을 Allocate_Name()함수로 pFrame->Name에저장
    pFrame->TransformationMatrix와 CombinedTransformationMatrix를 항등행렬로 초기화
    이제 생성한 pFrame을 인풋 ppNewFrame을 통해 전달해줌

  2. 	CreateMeshContainer함수로 메시컨테이너의 값을채워넣어줘야함 Frame과 동일하게 상속받은 구조체로 자유롭게 구조체에 데이터를 추가가능

    추가할데이터

    1. 텍스처배열가리키는 포인터 ppMaterialTextures

    2. Transform을 곱할때 원본을 계속 가지고있게하기위한
      LPD3DXMESH pOriginalMesh

    3. 뼈의갯수 iNumBones

    4. SkinInfo에 저장되어있는 초기위치 pOffsetMatrices

    5. 오프셋과 컴바인을 곱하여 저장한 렌더링매트릭스 pRenderingMatrices

    6. 프레임의 컴바인 행렬을 가리키는 더블포인터 ppCombindTranformationMatrices 포인터가 아니라 더블포인터인 이유는 초기에 한번 주소값을 넣어넣고 값을 가져다쓸것이기 때문이다.
      1번 인자 LPCSTR Name

      다음 우선 Allocate_Name으로 pMeshContainer->Name을 넣어준다.
      2번 인자 const D3DXMESHDATA* pMeshData

      그 다음 D3DVERTEXELEMENT9 Element[MAX_FVF_DECL_SIZE];을 이용해 정점의 FVF를 대용한다. 이를 사용하면 이점은 탄젠트,바이노말같은 FVF에선 정의되어있지않은 값을 사용할수있다.
      pMeshData->pMesh->GetDeclaration(Element);
      를 통해 현재 메시의 정보를 Element에 저장하고 추가하고싶은 데이터를 추가할수있다.
      pMeshData->pMesh->CloneMesh(옵션,엘리먼트,장치,&pMeshContainer->MeshData.pMesh)
      를 호출해 메시컨테이너의 메시데이터의 복사해서 저장한다.
      pMeshContainer->MeshData.Type = D3DXMESHTYPE_MESH;
      로 pMesh를 사용했음을 정의한다.

      5번 인자 NumMaterials
      pMeshContainer->NumMaterials = NumMaterials;
      받은 인자 그대로 넣어준다.

      다음 텍스처를 2차원 배열의 형태로 저장한다

      		pMeshContainer->ppMaterialTextures = new MESHMATERIALTEXTURE*[NumMaterials];
      
      		for (_uint i = 0; i < NumMaterials; i++)
      		{
      			pMeshContainer->ppMaterialTextures[i] = new MESHMATERIALTEXTURE;
      		}

      를 통해 머테리얼의 수만큼 동적할당 해주자.

      다음 재질의 수만큼 pTextureFilename를 pMaterials로부터 받아서 &pMeshContainer->ppMaterialTextures[i]->pDiffuseMap 노말 스펙큘러 맵에 넣어주자.

      다음 인접정보pAdjacency는 CloneMesh를 통해 복사받은 메시컨테이너의pMesh의GetNumFaces함수를 통해 폴리곤의 갯수를 구하고 *3할당해주고 memcpy로 pAdjacency를 pMeshContainer->pAdjacency에 복사해주자.

      pMeshContainer->pSkinInfo = pSkinInfo로 값을 넣어주고
      삭제되지않게 참조수를 1늘려준다.

      뼈의갯수 iNumBones는 스킨인포의 GetNumBones()함수로 넣어준다.

0개의 댓글