배운것
- Window와 DirectX 연결
- 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 : 정보를 입력 데이터를 설명하는 데이터 순서를 바인딩
질문
학교에서 배운 랜더링 파이프라인과 다른데 물체 하나만 하는 파이프라인인지 궁금함.
후기
끝나긴 했는데 공부할게 너무 많다.