KoreanFoodie's Study

DirectX 11 2D 게임 프로그래밍 - 11. Constant Buffer 개념과 응용 본문

Game Dev/DirectX

DirectX 11 2D 게임 프로그래밍 - 11. Constant Buffer 개념과 응용

GoldGiver 2021. 10. 31. 06:21


DirectX 11 2D 게임 프로그래밍 - 11. Constant Buffer 개념과 응용

Constant Buffer

- HLSL에서 cbuffer타입으로 받을 수 있다.

- 상수 버퍼는 반드시 16byte 단위로 정렬되어야 한다.

- D3D11_USAGE_DYNAMIC은 GPU가 읽고, CPU가 쓰는 방식이다.

 

World, View, Projection 행렬 적용하기

- Vertex Shader에서 mul() 함수를 통해 위치 벡터를 행렬과 곱하여 공간 변환시킬 수 있다.

- DirectX는 행 우선, HLSL은 열 우선 방식으로 행렬을 생성한다.

- HLSL에서는 row_maor 키워드로, DirectX에서는 Transpose로 행렬 생성 방식을 맞춰 줄 수 있다.

 

Execute.cpp

먼저 Constatnt Buffer를 구성해 보자.

	// Create Constant Buffer
	// COM Interface 객체를 만들 때는 Description이 먼저 구현되어야 한다.
	{
		D3D11_BUFFER_DESC desc;
		ZeroMemory(&desc, sizeof(D3D11_BUFFER_DESC));
		desc.Usage = D3D11_USAGE_DYNAMIC; // CPU - Write // GPU - READ
		desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
		desc.ByteWidth = sizeof(TRANSFORM_DATA);
		desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; // USAGE가 DYNAMIC이기 때문에 CPU가 접근 가능하게 설정하자.

		auto hr = graphics->GetDevice()->CreateBuffer(&desc, nullptr, &gpu_buffer);
		assert(SUCCEEDED(hr));

	}

 

Color.hlsl

그 후 Color.hlsl에서 cbuffer 구조체를 만들어 준다.

// cbuffer : Constant buffer
cbuffer TransformBuffer : register(b0) // -> 0 ~ 13 (슬롯 번호) // (4096 *) 16 byte 단위로 정렬해야 한다.
{
	matrix world;
	matrix view;
	matrix proj;
}

PixelInput VS(VertexInput input)
{
	// 1 X 4			4 X 4	----> 1 X 4
	// 1, 2, 3, 1	*	0000
	//					0000
	//					0000
	//					0000
	
	PixelInput output;

	// 위치 변환할 때 행렬을 곱해주면 된다!
	output.position = mul(input.position, world);
	output.position = mul(output.position, view);
	output.position = mul(output.position, proj);
	output.color = input.color;
	
	return output;
}

 

 

 


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

 
Comments