상수버퍼는 Vertex Shader 단계에서 변수를 사용하고 싶을 때 사용한다.
만약 진짜 게임을 만든다고 했을 때 키보드의 입력에 따라 캐릭터가 움직인다고 하면
키보드의 입력에 따라 움직여야한다.
하지만 지금은 Vertex Shader 단계에서 이뮤터블로 지정되어 GPU Read Only밖에 안되기 때문에 갱신이 불가하다.
버텍스버퍼와 인덱스 버퍼 처음입력하고는 변화가 없다.
정점은 모양 그대로를 나타내는 것으로 그대로 있고 새로 만드는 것이 아니다.
-> 물체를 옮긴다 -> 정점을 옮긴다. - 모양은 변하지않는다.
결국 이동은 버텍스 쉐이더 단계에서 이루어지게 된다.
cbuffer TransformData : register(b0)
{
float4 offset;
}
//정점 쉐이더- 위치관련 -> 레스터라이저-정점바탕으로 도형만들고 내/외부 판단 및 보간
VS_OUTPUT VS(VS_INPUT input)
{
VS_OUTPUT output;
output.position = input.position+offset;
output.uv = input.uv;
return output;
}
위의 코드에서 보면 input position과 uv가 변하는 것이 아니라 offset이 더해지는 것이다.
이제 상수버퍼를 만들어보자
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);
}
이를 위해서 TransfromData라는 구조체를 만들어주자
struct TransformData
{
Vec3 offset;
float dummy; //정렬을 위한 더미
};
또한 상수버퍼를 위한 버퍼 변수도 설정해주었다.
private:
TransformData _transformData;
ComPtr<ID3D11Buffer> _constantBuffer;
이렇게 되면 CPU쪽에서 write할 수 있는 상수버퍼가 생성되게 된다.
또한 나중에 TransformData에 SRT 값을 행렬로 넣어서 유의미한 이동을 볼 수 있다.
이 상수버퍼는 Update를 통해 매틱 복사가 일어난다.
과정은 map을 통해 뚜겅을 열고 복사한다음 unmap으로 뚜겅을 닫아주면 된다.
void Game::Update()
{
_transformData.offset.x = 0.3f;
_transformData.offset.y = 0.3f;
D3D11_MAPPED_SUBRESOURCE subResouce;
ZeroMemory(subResouce, sizeof(subResouce));
//맵을 통해 값을 넣어줄 준비를 한다. 이후 값을 넣고(복사해주고) UNMAP
_deviceContext->Map(_constantBuffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &subResouce);
::memcpy(subResouce.pData,&_transformData,sizeof(_transformData); //바로 cpu-> gpu 넘어가게 된다.
_deviceContext->Unmap(_constantBuffer.Get(),0);
}
그리고 Render부분에 상수버퍼가 동작하도록 등록해주자.
//VS
_deviceContext->VSSetShader(_vertexShader.Get(), nullptr, 0); //이걸로 일하게
_deviceContext->VSSetConstantBuffers(0, 1, _constantBuffer.GetAddressOf());
이렇게 되면 물체가 움직인 결과물을 볼 수 있다.
입력을 수정하는 것이 아니라 추가적인 정보를 넣어서 물체를 이동시켜야한다.
매시는 틀이고 움직임을 매시를 얼만큼 움직이느냐이다. 만약 움직일때마다
★ ★ ★
버텍스를 다시 계산해서 넣어주면 엄청많은 삼각형을 연산하고 다시 위치연산을 해야하는데 이것은 말이 안된다는 것이다.
'게임공부 > Directx11' 카테고리의 다른 글
[Directx11]8. Simple Math (0) | 2024.07.15 |
---|---|
[Directx11]7. RasterizerState, SampleState, BlendState (0) | 2024.07.10 |
[Directx11][C++]5. 텍스처와 UV (0) | 2024.07.01 |
[Directx11][C++]4. 삼각형 그리기 (1) | 2024.07.01 |
[Directx11]3.장치초기화 (0) | 2024.06.27 |