DirectX/DirectX 2D

DX2D_9 WVP2

컴맹학자 2022. 12. 4. 18:34
728x90

DX2D_9에서 많은 함수 들이 사용 되었는데 D3DXMatrixIdentity() 같은 항등행렬로 초기화 같은 것도 있지만 추가 설명 및 클래스를 깔끔하게 정리 할 예정

 

1. 클래스 정리

쓸모 없거나 중복되는 코드를 정리해서 Github에 올려 둠

 

https://github.com/ascher8159/DX2D

DX2D_09_02


2. 함수 기능 정리

-- 공통

D3DXMatrixIdentity() 

※ Matrix 구조체 및 4*4 행렬이 들어오면 항등 행렬로 반환

 

-- 카메라 관련

D3DXMatrixLookAtLH() 

※ 카메라가 바라보는 눈, 위치, 카메라위 Up Vector값를 셋팅 후 반환 (왼손 좌표계)

D3DXMatrixOrthoOffCenterLH()

※ 카메라가 비춰지는 화면 정의 (왼손 좌표계, 2D에서는 Orthgraphic 옵션을 사용)

 

-- 크기, 회전, 위치

공통 : 해당 메트릭스 안에는 D3DXMatrixIdentity() 기능이 내장되어 있다.

D3DXMatrixScaling()

※ Matrix의 크기에 대한 부분을 셋팅 해서 반환 (_11, _22, _33)

D3DXMatrixRotationYawPitchRoll()

※ Matrix의 회전에 대한 부분을 셋팅 해서 반환 (2D에서는 사용을 안함)

D3DXMatrixTranslation()

※ Matrix의 위치에 대한 부분을 셋팅 해서 반환 (_41, _42,_43)

 

World에 실제로 값을 셋팅 할땐 크기 * 회전 * 위치 순으로 곱해야 재대로 반영이 된다

World = S * R * T 

World = S * T <== 현재는 회전을 안사용 하기 때문에 크기와 위치값만 곱해서 셋팅

 

World마다 하나의 오브젝트만 담는다. 2개 이상 그리게 되면 각각의 World값을 셋팅 해서 넣어줘야 한다.


3. 응용

위에 정리된 클래스로 이번엔 상자를 두개를 찍어볼 예정

 

Scene.cpp -> World Matirx 추가

※ 기존에 그려져 있던건 World1으로 추가로 그릴껀 World2로 


 

Scene.cpp -> Vector3 position 추가

※ 별도의 네모를 그리기 위한 position Vector3 추가


 

Scene.cpp -> void Update()

※ gpu에 값을 셋팅한 World값은 삭제 및 별도로 움직이기 위한 키 이벤트 추가

더보기
void Update() 
{	
	//Key (World 1)
	{
		if (Key->Press('A'))
			position.x -= 0.1f;
		else if (Key->Press('D'))
			position.x += 0.1f;

		if (Key->Press('W'))
			position.y += 0.1f;
		else if (Key->Press('S'))
			position.y -= 0.1f;

		D3DXMATRIX S, T;
		D3DXMatrixScaling(&S, 100, 100, 1.0f);
		D3DXMatrixTranslation(&T, position.x, position.y, 0.0f);
		World1 = S * T;
	}
	
	//Key (World 2)
	{
		if (Key->Press(VK_LEFT))
			position2.x -= 0.1f;
		else if (Key->Press(VK_RIGHT))
			position2.x += 0.1f;

		if (Key->Press(VK_UP))
			position2.y += 0.1f;
		else if (Key->Press(VK_DOWN))
			position2.y -= 0.1f;

		D3DXMATRIX S, T;
		D3DXMatrixScaling(&S, 100, 100, 1.0f);
		D3DXMatrixTranslation(&T, position2.x, position2.y, 0.0f);
		World2 = S * T;
	}

	//Set WVP
	shader->AsMatrix("View")->SetMatrix(View);
	shader->AsMatrix("Projection")->SetMatrix(Projection);
}

Scene.cpp -> void Render()

※ update()에서 처리 했던 gpu에 값을 넣는 부분을 셋팅하고 Color 값도 쉐이더에 넘김

더보기
void Render()
{
	D3DXCOLOR bgcolor = D3DXCOLOR(0.22f, 0.27f, 0.44f, 1.0f);   // 배경색
	DeviceContext->ClearRenderTargetView(RTV, (float*)bgcolor); //앞
	{
		UINT stride = sizeof(Vertex); //간격(보폭, 인덱스 나눠줄 크기)
		UINT offset = 0;		 	  //시작점

		DeviceContext->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset);
		DeviceContext->IASetIndexBuffer(IndexBuffer, DXGI_FORMAT_R32_UINT, 0);
		DeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

		//출력
       	 	// obj1
		shader->AsMatrix("World")->SetMatrix(World1);
		shader->AsVector("Color")->SetFloatVector(Color(1, 0, 1, 1));
		shader->DrawIndexed(0 , 0 , 6); //변경
		// obj2
		shader->AsMatrix("World")->SetMatrix(World2);
		shader->AsVector("Color")->SetFloatVector(Color(1, 1, 0, 1));
		shader->DrawIndexed(0, 0, 6); //변경
	}
	ImGui::Render(); //ImGui 출력
	SwapChain->Present(0, 0); //BackBuffer 출력
}

02_WVP 수정

※ 이번엔 값을 넘겨서 셋팅 해야 하기 때문에 Color 주석 풀고 ps 처리 방식도 수정


실행

※ 키보드의 adws, 키보드 방향키 별로 움직이는 네모 2개가 그려지면서 움직인다.

 

노랑색이 위에 있는 이유는 분흥색이 먼저 그려지고 난 후에 그려지기 때문이다 (Render()함수 World1,2 순서 바꾸면 됨)

 

여기서 핵심은 하나의 정점버퍼로 World Matrix 2개 셋팅 해서 2개의 네모를 출력 및 그려지는 순서에 따라 그림이 덮어진다는걸 확인

 

https://github.com/ascher8159/DX2D

DX2D_09_03

'DirectX > DirectX 2D' 카테고리의 다른 글

DX2D_11 Rect_Control (상속, 다형성)  (0) 2022.12.14
DX2D_10 Rect  (0) 2022.12.07
DX2D_09 WVP  (0) 2022.12.01
DX2D_08 ImGui  (0) 2022.11.27
정리 & Plug in  (0) 2022.11.26