매쉬를 xFile로 추출할 때 FVF 또는 Decl(노멀과 탄젠트가 추가)로 추출 할 수가 있다.

 

DirectX9으로 작업을 진행하면서 매쉬의 정점의 정보를 GetFVF로 받아오려고 할 때,

0으로 표시되는 경우가 발생하는데 이 경우는 추출한 매쉬 데이터의 정보가 FVF가 아닌 Decl로 되어있는 경우이다.

 

혹시나 매쉬가 FVF가 아닌 Decl일 때는 D3DXGetDeclVertexSize를 사용하여 정점의 정보를 얻어올 수 있는 방법도 있다.

 

xFile을 FVF 또는 Decl로 추출하는 방법은 다음과 같다.

위와 같이 DeclData를 체크하면 Decl의 정보를 가진 매쉬가 추출이 되고 해제하면 FVF의 정보를 가진 매쉬가 추출된다.

3D 작업을 하다보면 폴리곤 수로 인해서 최적화가 필요할 일이 생길 수가 있다.

 

그런데 3DS MAX에서 이 문제를 간단하게 해결하는 방법이 있다.

 

먼저 아무 모델링 하나를 불러와서 오브젝트 하나를 클릭하여 폴리곤의 개수를 확인한다. 

 

폴리곤의 개수를 확인하려면 해당 뷰에서 왼쪽 상단에 + 버튼을 누르고 Configure Viewports를 누른다.

그럼 아래와 같이 창 하나가 나오는데 여기서 Statistics를 누르고 SetUp에 현재 뷰에 표시하고 싶은 부분을 체크해준다.

폴리곤 개수면 Polygon Count를 체크하고 OK를 누르면 된다.

 

그리고 우측에 Total, Selection, Total + Selection이 있는데,

Selection을 체크하면 선택한 오브젝트의 폴리곤 개수를 확인할 수 있고,

Total은 현재 뷰 상에 있는 모든 오브젝트들의 폴리곤 개수를 확인할 수가 있다.

개수 표시를 하고난 후에

 

폴리곤의 개수를 줄이고 싶은 오브젝트를 클릭한 상태로 우측에 있는 무지개 모양을 누르고

아래 Modifier List를 누르고 ProOptimizer를 찾아서 클릭해준다.

그 다음 아래에 있는 Optimization Level에 Calculate를 누르고 Vertex %를 조정하면

다음과 같이 폴리곤의 수가 줄어드는 것을 볼 수 있다.

그런데 폴리곤의 수를 줄이기 전에 체크 해야할 부분이 있다.

 

ProOptimizer 옵션 아래 부분에 가면 Materials and UVs 라는 옵션이 있다.

여기서 Keep Textures 와 Keep UV Boundaries를 체크해줘야한다.

이 두가지를 체크 해주면 폴리곤의 개수가 떨어져도 텍스처 UV의 정보를 보존시켜준다.

 

또 동일한 오브젝트가 뷰 상에 존재한다면 하나만 해주면 모두 적용된다.

먼저 아래 사이트에서 3DS MAX x File Exporter를 다운 받을 수 있다.

www.cgdev.net/axe/download.php

 

DirectX Exporter and X Viewer Download

Recommended Configuration Settings Installation Extract the dle file into the plugins directory of 3ds Max. e.g.:   C:\Program Files\Autodesk\3ds Max 2017\plugins If you are encountering a runtime error when start 3ds Max you need to install Visual C++ 20

www.cgdev.net

다운로드가 끝나고 압축을 풀면 Axe_free_v2.2.8_max(버전).dle 이라는 파일이 있는데,

해당 파일을 ProgramFiles/Autodesk/3dsMax(버전)/plugins/ 폴더 안에 붙여넣는다.

이후 3ds max를 실행하고 Export를 진행하면 다음과 같이 .x 파일 확장자가 생긴 것을 볼 수 있다.

 

다음과 같이 Text 파일 형식으로 애니메이션 파일을 .x 파일로 익스포트를 한 후

각각의 .x 파일을 텍스트로 열고 Ctrl + F를 눌러서 "AnimationSet"을 적고 아래로 찾기를 누르면

텍스트에서 다음과 같이 애니메이션의 이름이 나온다.

찾은 부분부터 다음 애니메이션의 이름까지 복사하여(없으면 해당 애니메이션이 마지막임..) 

합치려는 .x 파일 텍스트 끝에 이어 붙인다.

애니메이션의 순서는 아래에서부터 0 ~ 이다.

이번에는 DLL 파일을 클라이언트로 파싱하는 것을 해보려고한다.

 

DLL 프로젝트를 만들기전에 기본적인 프로젝트 세팅을 먼저해준다.

 

1. 빈 프로젝트 만들기

처음에 빈프로젝트를 만들어주고 다음과 같이 솔루션만 남겨놓고 만들어진 프로젝트를 지워준다.

 

2. Client 프로젝트와 DLL 프로젝트 만들기

비어있는 솔루션에 오른쪽 마우스 클릭 후 Client 프로젝트와 DLL 프로젝트를 만들어준다.

Client 프로젝트는 콘솔 응용 프로그램

DLL 프로젝트는 DLL(동적 라이브러리) 프로그램으로 만들어준다.

 

 

3. DLL 프로젝트에 매니지먼트 클래스 만들기

매니지먼트 클래스는 클라이언트 프로젝트에 DLL의 정보를 넘겨주기 위한 클래스이다.

매니지먼트 클래스는 한 개만 사용할 것이므로 싱글톤 클래스로 만들어준다.

 

.h

#pragma once
class CManagement
{
private:
	CManagement();
	~CManagement() = default;

public:
	static CManagement* Get_Instance();

	static void Destroy_Instance();

	void TestFunc();

private:
	static CManagement* m_pInstance;
};

 

.cpp

매니지먼트 객체는 static 형식이기 때문에 초기화는 다음과 같이 진행한다.

#include "Management.h"
#include <iostream>

using namespace std;

CManagement* CManagement::m_pInstance = nullptr;

CManagement::CManagement()
{
}

CManagement * CManagement::Get_Instance()
{
	if (m_pInstance == nullptr)
	{
		m_pInstance = new CManagement;
	}

	return m_pInstance;
}

void CManagement::Destroy_Instance()
{
	if (m_pInstance != nullptr)
	{
		delete m_pInstance;
		m_pInstance = nullptr;
	}
}

여기서 주의해야 할 점은 DLL 파일은 클래스의 선언부(.h)를 넘겨주는 것이기 때문에

정의부(.cpp)는 위와 같이 넘겨주는 클래스에서 정의해줘야 한다. 

 

4. DLL 안에 있는 정보를 내보내기 전 세팅 

DLL 파일을 파싱하기 위해서는 _declspec 키워드를 넘겨주고 싶은 클래스의 헤더파일에 클래스명 앞에 명시해준다.

 

 

_declspec 키워드에는 dllexport와 dllimport가 있다.

dllexport : DLL에서 데이터, 함수, 클래스 또는 클래스 멤버함수를 내보낼 수 있다.

dllimport : .def 파일을 사용할 필요가 없도록 내보내기 지시문을 개체 파일에 추가한다.

 

5. 매니지먼트에 테스트용 함수 만들기

#include "Management.h"
#include <iostream>
using namespace std;

CManagement* CManagement::m_pInstance = nullptr;

CManagement::CManagement()
{
}


CManagement::~CManagement()
{
}

void CManagement::TestFunc()
{
	cout << "DLL Test!!" << endl;
}

6. DLL 파일 생성

매니지먼트에 테스트용 함수까지 만들었으면 해당 DLL 프로젝트에서 솔루션 빌드를해준다.

솔루션 빌드를 했을 때 다음과 같은 오류가 나올 수도 있다.

 

이 오류는 프로젝트 구성형식이 dll 파일이 아닌 다른 파일로 지정되어있을 때 발생한다.

해당 오류가 발생 시 다음과 같이 프로젝트 속성 -> 일반 -> 프로젝트 구성 형식을 바꿔준다.

 

 

그리고 출력 디렉터리를 수정하여 DLL 파일이 제대로 뽑혔는지 확인한다.

경로 수정은 자유이다.

 

7. 클라이언트로 파싱

클라이언트로 파싱을 해주기 위해서는 먼저 클라이언트 프로젝트 속성에서

추가 종속성에 라이브러리 파일을 추가해줘야한다.

라이브러리 파일은 TestDLL 프로젝트를 빌드하면 .dll 파일과 함께 같은 폴더(실행 파일 폴더)에 생성된다.

 

 

여기까지 완료하였으면 DLL 프로젝트 폴더에 있는 매니지먼트 헤더 파일을 복사하여 클라이언트 폴더로 붙여준다.

 

이유는 다음과 같이 헤더 파일을 Include 해주려고 할 때 상대경로까지 적어줘야될 필요없이 작업을 하기 위해서이다.

#include "../TestDLL/Management.h" // 파일 복붙을 안했을 때

#include "Management.h"            // 파일 복붙을 했을 때

 

헤더 파일을 복사하고나서 TestDLL 프로젝트의 DLL 파일이 있는 경로로가서 dll파일과 lib파일을 복사하여

dll 파일은 클라이언트 실행 파일이 있는 폴더로,

lib 파일은 클라이언트 솔루션 파일이 있는 폴더로 붙여넣기를 해준다.

 

여기서 lib 파일은 어느 폴더에 있던 상관없다.

다만 추가 포함 디렉터리에 해당 파일이 있는 폴더의 경로를 추가 해줘야 한다.

 

 

각 폴더에 파일을 옮기고나서 다음과 같이 정의하여 클라이언트에서 빌드를 하게되면,

dll 프로젝트에 만들었던 함수가 실행되는 것을 볼 수 있다.

 

#include "stdafx.h"
#include "Management.h"     

int main()
{
	CManagement* m_pManagement = CManagement::Get_Instance();

	m_pManagement->TestFunc();

    return 0;
}

 

'Programming > DLL' 카테고리의 다른 글

정적라이브러리와 동적라이브러리의 장단점  (0) 2021.01.25

+ Recent posts