Constant Buffer (상수 버퍼)의 역할과 GPU 활용 흐름 완전 정복
– Vertex Shader 단계에서 CPU → GPU로 데이터를 전달해 객체의 위치를 효율적으로 조정하는 상수 버퍼의 구조, 사용 목적, 구현 방식 전부 설명
Constant Buffer(상수 버퍼)는 GPU의 쉐이더, 특히 Vertex Shader에서 일정 시간 동안 유지되는 데이터를 전달하기 위해 사용하는 읽기 전용 버퍼다.
주로 위치, 회전, 스케일 같은 객체의 변환 정보, 조명, 카메라 등 자주 바뀌지만 소량인 데이터를 GPU에 전달하는 데 사용된다.
offset 값을 더하는 방식으로 도형을 이동시킬 수 있다.cbuffer TransformData : register(b0)
{
    float4 offset;
}cbuffer TransformData: 상수 버퍼 이름.register(b0): 이 버퍼는 b0 슬롯에 바인딩됨.offset: 외부에서 전달된 이동 벡터. float4 타입으로 쉐이더에서 position과 연산 가능.VS_OUTPUT VS(VS_INPUT input)
{
    VS_OUTPUT output;
    output.position = input.position + offset;
    output.uv = input.uv;
    return output;
}input.position: 정점 버퍼에서 전달된 원래 위치.offset: 외부에서 전달된 이동값을 더해 위치 변경.output.uv: 텍스처 좌표 그대로 전달.struct TransformData
{
    Vec3 offset;
    float dummy; // 16바이트 정렬 맞춤
};offset: 위치를 나타내는 벡터.dummy: 3D 벡터(Vec3)가 12바이트이기 때문에 GPU 요구사항(16바이트)에 맞춰 정렬.void Game::CreateConstantBuffer()
{
    D3D11_BUFFER_DESC desc;
    ZeroMemory(&desc, sizeof(desc));
    desc.Usage = D3D11_USAGE_DYNAMIC; // CPU Write + GPU Read
    desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
    desc.ByteWidth = sizeof(TransformData);
    desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
    HRESULT hr = _device->CreateBuffer(&desc, nullptr, _constantBuffer.GetAddressOf());
    CHECK(hr);
}D3D11_USAGE_DYNAMIC: GPU에서 읽고 CPU에서 자주 쓰는 용도.D3D11_CPU_ACCESS_WRITE: CPU가 데이터를 쓸 수 있도록 설정.ByteWidth: 전달할 구조체 크기와 일치.CreateBuffer: GPU에 버퍼 생성.private:
    TransformData _transformData;
    ComPtr<ID3D11Buffer> _constantBuffer;_transformData: 매 프레임 CPU에서 수정할 위치 데이터._constantBuffer: GPU에 전달할 상수 버퍼 객체.void Game::Update()
{
    _transformData.offset.x += 0.003f;
    _transformData.offset.y += 0.003f;
    D3D11_MAPPED_SUBRESOURCE subResource;
    ZeroMemory(&subResource, sizeof(subResource));
    _deviceContext->Map(_constantBuffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &subResource);
    ::memcpy(subResource.pData, &_transformData, sizeof(_transformData));
    _deviceContext->Unmap(_constantBuffer.Get(), 0);
}Map: GPU 메모리를 CPU가 접근할 수 있도록 연다.memcpy: CPU 메모리 데이터를 GPU 버퍼에 복사.Unmap: 다시 GPU가 해당 버퍼를 사용할 수 있도록 닫는다._deviceContext->VSSetShader(_vertexShader.Get(), nullptr, 0);
_deviceContext->VSSetConstantBuffers(0, 1, _constantBuffer.GetAddressOf());b0 슬롯에 상수 버퍼를 바인딩.offset 변수 사용 가능.TransformData는 16바이트 정렬 필수이고, 셰이더의 float4와 정확히 대응되도록 설계되어야 한다.