KoreanFoodie's Study
DirectX 11 2D 게임 프로그래밍 - 11. Constant Buffer 개념과 응용 본문
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;
}
더 자세한 내용이 궁금하시다면 직접 들어보시는 걸 추천드립니다!
'Game Dev > DirectX' 카테고리의 다른 글
DirectX 11 2D 게임 프로그래밍 - 13. Rasterizer state과 좌표계 (0) | 2021.10.31 |
---|---|
DirectX 11 2D 게임 프로그래밍 - 12. 행렬 결합 : 이동과 회전 (0) | 2021.10.31 |
DirectX 11 2D 게임 프로그래밍 - 10. 행렬을 이용한 공간 생성(view, projection) (0) | 2021.10.28 |
DirectX 11 2D 게임 프로그래밍 - 9. Index Buffer & 공간 변환 (0) | 2021.10.27 |
DirectX 11 2D 게임 프로그래밍 - 8. Pixel Shader Stage & 도형 그리기 (0) | 2021.10.27 |
Comments