KoreanFoodie's Study
DirectX 11 2D 게임 프로그래밍 - 9. Index Buffer & 공간 변환 본문
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된 크기로 변환해 줌
더 자세한 내용이 궁금하시다면 직접 들어보시는 걸 추천드립니다!
'Game Dev > DirectX' 카테고리의 다른 글
DirectX 11 2D 게임 프로그래밍 - 11. Constant Buffer 개념과 응용 (0) | 2021.10.31 |
---|---|
DirectX 11 2D 게임 프로그래밍 - 10. 행렬을 이용한 공간 생성(view, projection) (0) | 2021.10.28 |
DirectX 11 2D 게임 프로그래밍 - 8. Pixel Shader Stage & 도형 그리기 (0) | 2021.10.27 |
DirectX 11 2D 게임 프로그래밍 - 7. Vertex Shader Stage (0) | 2021.10.25 |
DirectX 11 2D 게임 프로그래밍 - 6. Input Assembler Stage 세팅하기 (0) | 2021.10.24 |
Comments