수업기록 오늘은 디바이스 장치 초기화하는 날임.

어제 만든 타이머 매니저 이용해서 클라이언트 파일에 타이머를 설치함

타이머는 두개를 설치함.(1 이미디어트 2 FPS)

프레임 매니저 제작함. CFrame 과 CFrame 매니저 두개 생성. (당연히 헤더 파일 코드 파일 분리)

프레임 제한의 원리는 초당 몇번의 프레임을 움직일 것인가? 하는 원리이기에 그 제한을 걸어두는 limit 값이 필요함.

프레임은 당연히 실 객체이기에 (말단 객체) create와 free 함수를 소유함. ) 멤버 변수로 콜리미트와 시간 누적값 플롯 변수 생성. ) 60번의 1번 꼴로 콜을 일으키는 함수

레디 프레임) 멤버 변수로 선언한 콜리미트 = 1.f / (파라미터)

isPermitCall 에 파라미터로 들어오는 시간값을 누적. 그리고 시간값이 콜리미트보다 커지면 리턴 트루, 작으면 폴스 트루되면 누적값 0 초기화.

프레임 매니저는 타이머 매니저와 동일함.

그런데 싱글톤들은 프리를 소멸자에서 호출한다.(safe_Destroy 만들어보는 것도 가능함)


이후에 원래 했던 라이브러리 헤더와 dll파일 복붙해주고. client에서 프레임 레디를 시작.

타임을 두개 둔 이유는 이미디어트 프레임 퍼밋 콜{ fps 게임 루프 업데이트(fps타임) }


엔진 쪽에서 코드가 변경할 때마다 복붙하는게 귀찮으니 이제 자동화 하자

프로젝트 안에다 bat라는 확장자의 파일을 만들어줌. 자동 복사 커맨드 명령어를 써주려고 한다.

명령어 옵션 원본위치 사본위치 xcopy /y .\Engine\Header*.* .\Reference\Header
xcopy /y .\Engine\Bin\Engine.dll .\Client\Bin
xcopy /y .\Engine\Bin\Engine.lib .\Reference\Library\


다이렉트를 사용하려면 디바이스 장치 초기화를 해주어야 함. 다이렉트는 그래픽스만 하는 것이 아니라 하드웨어를 다루지만 그래도 우리가 하는 것은 그래픽 카드를 사용하기 위한 일련의 객체 생성과정이다. 각자 하드웨어를 다루려고 할 때마다 개별의 장치 초기화 작업이 필요하다. 다이렉트는 계층 구조화되어 있음

크게 3단계로 이루어져 있다.

1. 내 컴의 그래픽 카드의 성능을 조사할 객체를 생성한다.

여기가 모체이며 3번의 객체는 자식 객체이다. 우리가 주력으로 사용할 객체는 3번

2. 그래픽 카드의 성능을 조사한다

3. 그래픽 카드의 기능을 사용할 객체를 생성한다.

여기는 모든 그리기를 관할하는 객체이다. 선/점/면 마다 객체가 따로 있다.

장치 초기화

public ENGINE_DLL CGraphicDev : public CBase
{
	//이거 싱글톤 (싱글톤 생성)
private :
	LPDIRECT3D9 m_pSDK; //1번 객체
	LPDIRECT3DDEVICE9 m_pGraphicDev; //이게 3번 객체
private:
	HRESULT Ready_GraphicDev(Hwnd hwnd, WINMODE, emmode, ...);
	void Render_Begin(D3DXCOLOR Color) 
	void Render_End();
}

레디 함수 안에서 위 3번 단계 진행

{
	//1. 1번 객체 생성
	m_pSDK = Direct3DCreate9(D3D_SDK_VERSION);
 
	//2. 성능의 조사
	D3DCAPS9 DeviceCaps;
	zeromemory(&DeviceCaps,sizeof(D3DCAPS9));
 
	//현재 설치된 기본 그래픽 카드
	m_pSDK->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DEVTYPE_HAL,&DeviceCaps);
	_ulong dwFlag(0);
	if(DeviceCaps.DevCaps & D3DDEVCAPS_HWTRANSFOMANDLIGHT) //하드웨어에서 정점 연산(트랜스폼)과 조명(라이트)를 지원하는가?
	//이에 따라 하드웨어 버텍스 프로세싱 or 소프트웨어 프로세싱
	D3DPRESENT_PARAMETERS d3dpp;
	//이 안의 구조체 정보를 채워줘야 함.
	m_pSDK->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,dwFlag,&d3dpp,&m_pGraphicceDev);
	//
}

언어에게 그래픽 카드가 제공할 정보들을 모아둔 계층

버텍스 프로세싱 : 정점의 변환과 조명의 연산이

우리는 백버퍼를 사용할 떄 고속 복사는 연산이 너무 어렵다. 그래서 다이렉트 x의 discard는 페이지 플리핑 기법 기반의 스왑 체인지를 사용한다.(플립은 버퍼 하나 뒤집어가며 쓰는것)

색상값을 가진 픽셀을 사각형 형식으로 도열/나열한 것을 텍스쳐라고 한다. 화면용의 텍스텨를 저장하는 자료형은 서피스 자료형으로 저장한다.

전면 버퍼와 후면 버퍼의 역할이 정해져 있음. 전면 버퍼는 자신이 저장하고 있는 서페이스를 화면에 송신하는 역할만을 함. 후면 버퍼는 자신의 서페이스를 모두 지우고, 화면에 그릴 새로운 텍스쳐로 채운다. 그 후에 후면 버퍼가 전면 버퍼에게 서페이스를 넘기고, 전면은 자신이 가지고 있던 서페이스를 후면에게 보낸다.


enableautoDepthStencil ?

다이렉트 X에서 그리기 버퍼는 3개 타겟 버퍼 / 스탠실 버퍼 / Z버퍼(깊이 버퍼) 로 나뉜다.

화면에 출력하는 그림은 타겟 버퍼(백/전면 버퍼 둘다) 스탠실 버퍼는 반사하는 물체를 그리기 위한 버퍼(그림자와 물 등에 많이 사용함) depth버퍼는 z값 기준으로 자동으로 디바이스 장치가 정렬한다. 그 z값을 저장하는 버퍼가 바로 뎁스 버퍼다.