• Home
  • About
    • 게임 개발자 유정룡 photo

      게임 개발자 유정룡

      포트폴리오

    • Learn More
    • Email
    • Github
    • Bitbucket
  • Projects
    • All Projects
    • All Tags

DirectX11 공부 1일차(DirctX 연결, IA)

01 Jun 2021

Reading time ~2 minutes

배운것

  1. Window와 DirectX 연결
  2. IA 부분

Window와 DirectX 연결

Graphics 클래스 (추가요소)

void Graphics::Begin()
{
	device_context->OMSetRenderTargets(1, &render_target_view, nullptr);
	device_context->RSSetViewports(1, &viewport);
	device_context->ClearRenderTargetView(render_target_view, clear_color);
}

void Graphics::End()
{
	HRESULT hr = swap_chain->Present(1, 0);
	assert(SUCCEEDED(hr));
}

OM : Output Merger Stage

OMSetRenderTargets : 하나 이상의 랜더링 대상을 원자 적으로 바인딩 하고 깊이 스텐실 버퍼를 OM단계에 바인딩

RSSetViewports : 파이프라인의 래스터 라이저 단계에 뷰포트 배열을 바인딩

ClearRenderTargetView : 뷰포트를 지정한 색으로 처리

IDXGISwapChain :: Present : 사용자에게 랜더링된 이미지 제공

Execute 클래스

Execute::Execute()
{
	graphics = new Graphics();
	graphics->Initialize();
	graphics->CreateBackBuffer(static_cast<uint>(Settings::Get().GetWidth()), static_cast<uint>(Settings::Get().GetHeight()));
}

Execute::~Execute()
{
	SAFE_DELETE(graphics);
}

void Execute::Update()
{
}

void Execute::Render()
{
	graphics->Begin();

	{

	}

	graphics->End();
}

백버퍼 생성, Render()부분에 시작 끝 추가

DirectX 랜더링 파이프라인

입력조립기(IA) -> 정점 셰이더(VS) -> 덮개 셰이더(HS) -> 테셀레이터 -> 영역 셰이더(DS) -> 기하 셰이더(GS) -> 래스터화 단계 -> 픽셀 셰이더(PS) 단계 -> 출력 병합기(OS) 단계

자세히

IA 부분

Execute 클래스(추가요소)

struct VertexColor
{
	D3DXVECTOR3 position;
	D3DXCOLOR color;
};
	VertexColor* vertices = nullptr;
	ID3D11Buffer* vertex_buffer = nullptr;
	ID3D11InputLayout* intput_layout = nullptr;

원하는 포지션값과 색상값을 위해 구조체 생성

ID3D11Buffer : 구조화되지 않은 메모리 인 버퍼 리소스에 액세스

ID3D11InputLayout : 메모리에 배치되는 정점 데이터를 공급하는 방법을 정의 및 보유

Execute::Execute()
{
	graphics = new Graphics();
	graphics->Initialize();
	graphics->CreateBackBuffer(static_cast<uint>(Settings::Get().GetWidth()), static_cast<uint>(Settings::Get().GetHeight()));

	// Vertex Data
	{
		vertices = new VertexColor[3];
		vertices[0].position = D3DXVECTOR3(-0.5f, -0.5f, 0.0f);
		vertices[0].color = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f);

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

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

	// Vertex Buffer
	{
		// 버퍼 설정 값 지정
		D3D11_BUFFER_DESC desc;
		ZeroMemory(&desc, sizeof(D3D11_BUFFER_DESC));
		desc.Usage = D3D11_USAGE_IMMUTABLE;		// CPU가 GPU에 접근할 수 있게 할까?
		desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
		desc.ByteWidth = sizeof(VertexColor) * 3;
		
		// 버퍼에 들어갈 데이터 담기.
		D3D11_SUBRESOURCE_DATA sub_data;
		ZeroMemory(&sub_data, sizeof(D3D11_SUBRESOURCE_DATA));
		sub_data.pSysMem = vertices;

// 버퍼 생성
		HRESULT hr = graphics->GetDevice()->CreateBuffer(&desc, &sub_data, &vertex_buffer);
		assert(SUCCEEDED(hr));
	}
}

Vertext 데이터 생성 및 배열에 저장 후 버퍼 저장

D3D11_BUFFER_DESC : 버퍼 리소스

desc.Usage = D3D11_USAGE_IMMUTABLE;		
desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
desc.ByteWidth = sizeof(VertexColor) * 3;

Usage : CPU가 GPU에 접근할 수 있게 할까? (위험하지만 그만큼 성능이 올라감)

BindFlags : 리소스가 파이프라인에 바인딩 하는 방법 식별

ByteWidth : 크기

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

HRESULT hr = graphics->GetDevice()->CreateBuffer(&desc, &sub_data, &vertex_buffer);
assert(SUCCEEDED(hr));

D3D11_SUBRESOURCE_DATA : 하위 리소스를 초기화 하기 위한 데이터 지정

pSysMem : 초기화 데이터 가리키는 포인터

후 버퍼 생성

	uint stride = sizeof(VertexColor);
	uint offset = 0;

	graphics->Begin();

	{
		graphics->GetDeviceContext()->IASetVertexBuffers(0, 1, &vertex_buffer, &stride, &offset);
		// TODO : input layout
		graphics->GetDeviceContext()->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
	}

	graphics->End();

마지막으로 정점 버퍼 배열을 IA부분에 바인딩

후 정보를 입력 데이터를 설명하는 데이터 순서를 바인딩 (내건 position -> color)

IASetVertexBuffers : 정점 버퍼 배열을 IA 부분에 바인딩

IASetPrimitiveTopology : 정보를 입력 데이터를 설명하는 데이터 순서를 바인딩

질문

학교에서 배운 랜더링 파이프라인과 다른데 물체 하나만 하는 파이프라인인지 궁금함.

후기

끝나긴 했는데 공부할게 너무 많다.



DirectX Share Tweet +1