KoreanFoodie's Study

DirectX 11 2D 게임 프로그래밍 - 9. Index Buffer & 공간 변환 본문

Game Dev/DirectX

DirectX 11 2D 게임 프로그래밍 - 9. Index Buffer & 공간 변환

GoldGiver 2021. 10. 27. 22:37


DirectX 11 2D 게임 프로그래밍 - 9. Index Buffer & 공간 변환

Index Buffer 만들고 세팅하기 : 중복되는 정점을 제거하기 위해 사용한다.

 

공간이란 무엇인가? : 공간은 행렬로 표현됨. Local - World - View - Projection 순으로 흘러감. 이때 Projection은 3D 데이터를 2D 데이터로 변환시키는 작업임. (더 자세한 내용은 주석으로)

 

참고 :

Index Buffer를 활용해 원 그려보기

index buffer : 요즘은 4바이트, index는  unsinged int  형. 중복 정점을 줄이기 위해 사용.

D3D11_USAGE_IMMUTABLE : GPU - Read, CPU - 접근 불가

 

Execute.cpp

지난 글에서 삼각형 2개를 이용해 그렸던 사각형을 Index Buffer를 이용해 구현해 보자.

	// Vertex Data
	{
		vertices = new VertexColor[4];

		vertices[0].position = D3DXVECTOR3(-0.5f, -0.5f, 0.0f);			//0
		vertices[0].clear_color = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f);

		vertices[1].position = D3DXVECTOR3(-0.5f, +0.5f, 0.0f);			// 1
		vertices[1].clear_color = D3DXCOLOR(0.0f, 1.0f, 0.0f, 1.0f);

		vertices[2].position = D3DXVECTOR3(+0.5f, -0.5f, 0.0f);			// 2
		vertices[2].clear_color = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f);

		vertices[3].position = D3DXVECTOR3(+0.5f, +0.5f, 0.0f);			// 3
		vertices[3].clear_color = D3DXCOLOR(0.0f, 0.0f, 1.0f, 1.0f);

	}



    // Index data
	{
		indices = new uint[6]{0, 1, 2, 2, 1, 3};
		
	}

	// Index Buffer
	{
		D3D11_BUFFER_DESC desc;
		ZeroMemory(&desc, sizeof(D3D11_BUFFER_DESC));
		desc.Usage = D3D11_USAGE_IMMUTABLE;
		desc.BindFlags = D3D11_BIND_INDEX_BUFFER;
		desc.ByteWidth = sizeof(uint) * 6;

		D3D11_SUBRESOURCE_DATA sub_data;
		ZeroMemory(&sub_data, sizeof(D3D11_SUBRESOURCE_DATA));
		sub_data.pSysMem = indices;

		auto hr = graphics->GetDevice()->CreateBuffer
		(
			&desc,
			&sub_data,
			&index_buffer
		);

		assert(SUCCEEDED(hr));
	}

vertex data에서는 필요한 정점 4개만 남겨두고, Index data에서 indices를 활용해 어떤 정점을 어떻게 이을 것인지를 명시한다. 

그 후, Index Buffer에서 Buffer 설정을 마무리한다.

Rendering part 에서 IA 단계에서 IndexBuffer를 사용한다는 정보를 추가로 전달해야 한다.

graphics->GetDeviceContext()->IASetIndexBuffer(index_buffer, DXGI_FORMAT_R32_UINT, 0);

또한, 기존 Draw함수를 DrawIndexed로 대체해 주어야 한다.

		// Rendering Pipeline에 세팅이 끝났다면 항상 Draw 함수가 호출돼야 그려진다.
		graphics->GetDeviceContext()->DrawIndexed(6, 0, 0);

 

공간에 대한 추가 주석 :

 VS : Vertex Shader. Shader : GPU를 동작시키는 함수들의 집합
 - Shader : HLSL(High Level Shader Language), GLSL
 - Transform(VS 단계에서는 정점들의 공간 변환을 해준다!)
 Local : 설계도 내의 공간
 World : 세계 공간
 View : 보여지는 영역 (시야 공간)
 Projection : 투영 공간 - 차원을 낮추는 개념. 3D 데이터를 2D 데이터로 변환시키는 것
 Clip : 위의 공간들을 정규화시킨다.(0~1) 말 그대로 오리는 느낌. - Homogeneous space : 동차 (1, 0, 0, 0) 마지막 값을 w라고 하는데...
 w - 동차가 1이면 위치, 0이면 방향을 표현
 DirectX에서는 Projection과 Clip이 결합되어 있다.

 RS : Rasterizer : 3D 데이터를 2D 데이터로 바꿔주는 것 
 - VS 단계에서 정규화한 공간을 RS에서 다시 늘려준다!
 - NDC : Normalized Device Coordinate : 화면에 맞게 늘려짐
 NDC - Euclidean space 
 Viewport : 정규화된 크기를 다시 Rasterized된 크기로 변환해 줌

 

 

 


더 자세한 내용이 궁금하시다면 직접 들어보시는 걸 추천드립니다!

Comments