vectexBuffer 내용은 현재 GPU의 메모리 상에 올라와 있는데,
그 내용을 바꿔야 해당 정점들의 정보를 바꿀 수 있음
이 GPU에 올라가 있는 buffer 내용을 맵핑 할 수 있다.
D3D11_MAPPED_SUBRESOURCE tSub = {};
DEVICECONTEXT->Map(buffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &tSub);
::memcpy(&tSub.pData, triagnle, sizeof(Vtx) * 6);
DEVICECONTEXT->Unmap(buffer.Get(), 0);
map을 통해 gpu 상에 buffer에 대한 복사본을 가져오고
pdata에 해당 바뀐 내용을 저장하면
unmap을 하면 gpu 상에 buffer에 덮어쒸운다.
이렇게 버퍼내용을 수정하면 안좋은 점은 아래에 mesh 정보를 같이 사용하는 오브젝트 같은 경우는
mesh 내용 자체를 수정하면 다른 객체들 역시 해당 mesh에 대한 정보를 다시 수정를 해야하는 번거로운 일이 발생한다.
Vertex Shader 호출 수를 줄이는게 아니라
버텍스 버퍼에 있는 내용을 버텍스 쉐이더에서 가져올 때 해당 버퍼에 순서를 통해 가져옴
// Index Buffer 생성
idxp[0] = 0;
idxp[1] = 1;
idxp[2] = 2;
idxp[3] = 0;
idxp[4] = 2;
idxp[5] = 3;
BufferDesc = {};
// buffer 를 통해 보낼 정점의 정보 크기
BufferDesc.ByteWidth = sizeof(UINT) * 6;
// 정점의 크기 정보를 나타냄
BufferDesc.StructureByteStride = sizeof(UINT);
// 정점의 용도를 나타냄
BufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
// GPU에 있는 정보를 수정 할 수 있게 끔
BufferDesc.Usage = D3D11_USAGE_DEFAULT;
BufferDesc.CPUAccessFlags = 0;
tSubData = {};
tSubData.pSysMem = idxp;
DEVICE->CreateBuffer(&BufferDesc, &tSubData, Indexbuffer.GetAddressOf());
DEVICECONTEXT->IASetIndexBuffer(Indexbuffer.Get(),DXGI_FORMAT_R32_UINT,0);
index buffer는 다시 수정할 필요가 없기 때문에 usage,cpuaccessflags는 default와 0으로 한다.
DrawIndexed()로 그린다.
Mesh -> buffer 정보들
해당 mesh에 들어있는 buffer들의 정보에 다른 버퍼에 값을 더해주는 형태를 위해 필요한 buffer
해당 과정은 vertex shder에서 한다.
상수 버퍼는 무조건 16바이트로 맞춰줘야한다.
// 상수 버퍼
BufferDesc = {};
// buffer 를 통해 보낼 정점의 정보 크기
BufferDesc.ByteWidth = sizeof(tTransform);
// 정점의 크기 정보를 나타냄
BufferDesc.StructureByteStride = sizeof(tTransform);
// 정점의 용도를 나타냄
BufferDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
// GPU에 있는 정보를 수정 할 수 있게 끔
BufferDesc.Usage = D3D11_USAGE_DYNAMIC;
BufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
tSubData = {};
tSubData.pSysMem = idxp;
DEVICE->CreateBuffer(&BufferDesc, nullptr, constantBuffer.GetAddressOf());
regirest b0(리소스 바인딩)
DEVICECONTEXT->VSSetConstantBuffers(0, 1, constantBuffer.GetAddressOf());
// shader code
cbuffer TRANSFORM : register(b0)
{
float4 vWorldPos;
};
gpu에서 사용하는 register 메모리는 4096(쉐이더 모델 5.0 기준)이 최대다.
map,unmap 을 사용해 gpu에 있는 상수 버퍼를 수정해주면 된다.