게임엔진/DirectX

DX) 4. IA(InputAssembler)

PJNull 2023. 3. 3.
728x90
반응형

InputAssembler

 

IA단계는 랜더링 파이프 라인에서 가장 먼저 시행되는 단계이다. 이 단계에서 Device에서 생성한 VertexBuffer나 IndexBuffer의 데이터를 읽어들여 Primitive를 조합하여 파이프라인의 다음단계인 VS에 데이터를 전달하는 역할을 한다.
그 밖에도 쉐이더에게 넘겨줄 데이터를 분석한 정보를 넘겨주는 InputLayOut을 추가할수있다.

 

 

위와 같은 방식으로 생성된 VertexBuffer와 IndexBuffer, 그리고 InputLayOut을 DeviceContext에서 조립하는것이 IA단계라고 할수 있다. 그러기 위해서는 두 Buffer와 LayOut을 만들어주어야한다.

 

 

VertexBuffer생성

 

VertexBuffer는 GPU가 접근가능한 버퍼에 Vertex정보를 저장하는 용도로 사용된다.

 

class VertexBuffer
{
public:
	VertexBuffer(ComPtr<ID3D11Device>device):_device(device);
	~VertexBuffer();

	ComPtr<ID3D11Buffer>GetVertexBufferPtr() { return _vertexBuffer; }
	uint32 GetStride() { return _stride; }
	uint32 GetOffset() { return _offset; }
	uint32 GetCount() { return _count; }


	template<typename T>
	void CreateVertexBuffer(const vector<T>&_vertexs)
	{
		_stride = sizeof(T);
		_count = static_cast<uint32>(_vertexs.size());


		D3D11_BUFFER_DESC vertexdesc;
		ZeroMemory(&vertexdesc, sizeof(vertexdesc));
		vertexdesc.Usage = D3D11_USAGE_IMMUTABLE;//GPU만 읽을수 있는 데이터
		vertexdesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
		vertexdesc.ByteWidth = (uint32)(_stride * _count);

		D3D11_SUBRESOURCE_DATA vertexdata;
		ZeroMemory(&vertexdata, sizeof(vertexdata));
		vertexdata.pSysMem = &_vertexs[0];

		_device->CreateBuffer(&vertexdesc, &vertexdata, _vertexBuffer.GetAddressOf());
	}

private:
	ComPtr<ID3D11Device>_device;
	ComPtr<ID3D11Buffer>_vertexBuffer;

	uint32 _stride = 0;
	uint32 _offset = 0;
	uint32 _count = 0;

};

 

 

 

IndexBuffer생성

 

IndexBuffer는 중복되서 사용되는 정점의 갯수를 줄이기 위해서 사용된다.

class IndexBuffer
{
public:
	IndexBuffer(ComPtr<ID3D11Device>device):_device(device);
	~IndexBuffer();

	ComPtr<ID3D11Buffer>GetIndexBufferPtr() { return _IndexBuffer; }
	uint32 GetStride() { return _stride; }
	uint32 GetOffset() { return _offset; }
	uint32 GetCount() { return _count; }


	void CreateIndexBuffer(const vector<uint32>& _index)
   	{
	_stride = sizeof(uint32);
	_count = static_cast<uint32>(index.size());


	D3D11_BUFFER_DESC indexdesc;
	ZeroMemory(&indexdesc, sizeof(indexdesc));
	indexdesc.Usage = D3D11_USAGE_IMMUTABLE;//GPU만 읽을수 있는 데이터
	indexdesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
	indexdesc.ByteWidth = (uint32)(_stride*_count);

	D3D11_SUBRESOURCE_DATA indexdata;
	ZeroMemory(&indexdata, sizeof(indexdata));
	indexdata.pSysMem = index.data();

	HRESULT hr = _device->CreateBuffer(&indexdesc, &indexdata, _IndexBuffer.GetAddressOf());
	CHECK(hr);
	}

	

private:
	ComPtr<ID3D11Device>_device;
	ComPtr<ID3D11Buffer>_IndexBuffer;

	uint32 _stride = 0;
	uint32 _offset = 0;
	uint32 _count = 0;
};

 

 

InputLayOut생성

 

InputLayOut은 Shader에 넘겨줄 VertexBuffer의 데이터의 구조를 설명해주는 정보를 넘겨주는 단계이다. 

 

class InputLayout
{
public:
	InputLayout(ComPtr<ID3D11Device> device):_device(device);
	~InputLayout();

	ComPtr<ID3D11InputLayout>GetInputLayoutPtr() { return _inputLayout; }

	void CreateInputLayout(const vector<D3D11_INPUT_ELEMENT_DESC>& descs, ComPtr<ID3DBlob> blob)
   	{
    
   	{"POSITION",0,DXGI_FORMAT_R32G32B32_FLOAT,0,0,D3D11_INPUT_PER_VERTEX_DATA,0},
	{"TEXCOORD",0,DXGI_FORMAT_R32G32_FLOAT,0,D3D11_APPEND_ALIGNED_ELEMENT,D3D11_INPUT_PER_VERTEX_DATA,0},

	const int32 count = static_cast<uint32>(descs.size());
	_device->CreateInputLayout(descs.data(), count, blob->GetBufferPointer(), blob->GetBufferSize(), _inputLayout.GetAddressOf());
	}


private:
	
	ComPtr<ID3D11Device>_device;

	ComPtr<ID3D11InputLayout>_inputLayout = nullptr;
};

 

 

IA단계 설정

 

IA단계에서 필요한 Index/VertexBuffer와 LayOut을 생성하였다면 DeviceContext를 통해 설정을 해준다. 이 부분은 차후에 필요로 하는 곳에서 넣는것으로 한다.

_deviceContext->IASetIndexBuffer(buffer->GetIndexBufferPtr().Get(), DXGI_FORMAT_R32_UINT, 0);
_deviceContext->IASetVertexBuffers(0, 1, buffer->GetVertexBufferPtr().GetAddressOf(), &stride, &offset);
_deviceContext->IASetInputLayout(info.inputLayout->GetInputLayoutPtr().Get());
_deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
728x90
반응형

'게임엔진 > DirectX' 카테고리의 다른 글

DX) 6. Tessellation  (0) 2023.06.01
DX)3.Device  (0) 2023.03.03
DX)2.렌더링파이프라인 가이드  (0) 2023.03.03
DX)1.렌더링 파이프라인  (0) 2023.02.11
DirectX) 프로젝트 설정  (0) 2022.02.26

댓글