VertexBuffer - Noanswers/shipman GitHub Wiki
GPU๊ฐ ์ ์ ๋ฐฐ์ด์ ์ ๊ทผํ ์ ์์ผ๋ ค๋ฉด, ๋ฐฐ์ด๋ค์ ์ ์ ๋ค์ ๋ฒํผ์ ๋ด์๋์ด์ผ ํฉ๋๋ค. ํด๋น ๋ฒํผ๋ค์ ์ ์ ๋ฑ์ ์๋ฃ๋ง ๋ด๋ ๊ฒ์ด ์๋๋ผ CPU๋ GPU๊ฐ ํด๋น ์๋ฃ์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ ๋ฑ์ ์ ๋ณด๋ ์ ์ฅํฉ๋๋ค. ID3D11Buffer ๊ตฌ์กฐ์ฒด๊ฐ ์ด ์ญํ ์ ๋ด๋นํ๊ฒ ๋ฉ๋๋ค.
๊ทธ ์ค ์ ์ ์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๋ ๋ฒํผ๋ฅผ ์ ์ ๋ฒํผ๋ผ๊ณ ๋ถ๋ฆ ๋๋ค. ์ ์ ๋ฒํผ๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋ ๋ค์์ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํฉ๋๋ค.
- ์์ฑํ ๋ฒํผ๋ฅผ ์์ ํ๋ D3D11_BUFFER_DESC ๊ตฌ์กฐ์ฒด๋ฅผ ์ฑ์์ผ ํฉ๋๋ค.
- ๋ฒํผ์ ์ด๊ธฐํ์ ์ฌ์ฉํ ์๋ฃ๋ฅผ ์์ ํ๋ D3D11_SUBRESOURCE_DATA ๊ตฌ์กฐ์ฒด๋ฅผ ์ฑ์์ผ ํฉ๋๋ค.
- ID3D11Device::CreateBuffer ํจ์๋ฅผ ํธ์ถํด์ ๋ฒํผ๋ฅผ ์์ฑํฉ๋๋ค.
##D3D11_BUFFER_DESC##
- ์ด ์๋ฃํ์ ๋ฒํผ์ ์ธ๋ถ ์ฌํญ์ ๊ฒฐ์ ํ๋ ์ค์ ๊ฐ์ ์ ์ฅํ๋ ๊ตฌ์กฐ์ฒด์ ๋๋ค.
- ์ ์ ๋ฒํผ ๋ฑ์ ๋ฒํผ๋ฅผ ์์ฑํ ๋, ์ด ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
typedef struct D3D11_BUFFER_DESC
{
UINT ByteWidth;
D3D11_USAGE Usage;
UINT BindFlags;
UINT CPUAccessFlags;
UINT MiscFlags;
UINT StructureByteStride;
} D3D11_BUFFER_DESC;
-
ByteWidth :
- ์์ฑํ ์ ์ ๋ฒํผ์ ํฌ๊ธฐ๋ฅผ ๋งํฉ๋๋ค
- ๋ณดํต size0f(VertexType) * vertexCount ๋ฅผ ์ ๋ ฅํฉ๋๋ค.
-
Usage :
- ๋ฒํผ๊ฐ ์ฐ์ด๋ ์ฉ๋๋ฅผ ์ง์ ํฉ๋๋ค.
- D3D11_USAGE_DEFAULT
- GPU๊ฐ ๋ฒํผ์ ์์์ ์ฝ๊ณ ์จ์ผ ํ๋ค๋ฉด ์ด ์ฉ๋๋ฅผ ์ง์ ํฉ๋๋ค.
- CPU๋ ์ด ์ฉ๋๋ฅผ ๊ฐ์ง ์์์ ๋งคํ API๋ฅผ ํตํด์ ์ฝ๊ฑฐ๋ ์ธ ์๋ ์์ต๋๋ค.
- ๊ทธ๋ฌ๋ ID3D11DeviceContext::UpdateSubresource๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ฐ๋ฅํฉ๋๋ค.
- D3D11_USAGE_IMMUTABLE
- ๋ฒํผ๋ฅผ ์์ฑํ ํ์ ์ ๋ ๋ณ๊ฒฝํ ์ผ์ด ์๋ค๋ฉด ์ด ๊ฐ์ ์ฌ์ฉํฉ๋๋ค.
- D3D11_USAGE_DYNAMIC
- CPU๊ฐ ๋ฒํผ ๋ด์ฉ์ ์์ฃผ ๊ฐฑ์ ํด์ผ ํ๋ค๋ฉด ์ด ๊ฐ์ ์ฌ์ฉํฉ๋๋ค.
- ๋งคํ API(ID3D11DeviceContext::Map) ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฃ๋ฅผ ๊ธฐ๋กํ ์ ์์ต๋๋ค.
- ์ฑ๋ฅ์์ ๋ถ์ด์ต์ด ์์ต๋๋ค.
- D3D11_USAGE_STAGING
-
BindFlags
- ์ ์ ๋ฒํผ๋ ๋ฌด์กฐ๊ฑด D3D11_BIND_VERTEX_BUFFER ๊ฐ์ ์ง์ ํฉ๋๋ค.
-
CPUAccessFlags
- CPU๊ฐ ๋ฒํผ์ ์ ๊ทผํ๋ ๋ฐฉ์์ ๊ฒฐ์ ํ๋ ํ๋๊ทธ๋ค์ ์ง์ ํฉ๋๋ค.
- ๋ฒํผ ์์ฑ ์ดํ CPU๊ฐ ๋ฒํผ๋ฅผ ์ฝ๊ฑฐ๋ ์ฐ์ง ์๋๋ค๋ฉด 0์ ์ง์ ํฉ๋๋ค.
- ์๋ฃ๋ฅผ ๊ธฐ๋กํด์ ๋ฒํผ๋ฅผ ๊ฐฑ์ ํด์ผํ๋ค๋ฉด D3D11_CPU_ACCESS_WRITE ๋ฅผ ์ง์ ํฉ๋๋ค.
-
MiscFlags
- ์ ์ ๋ฒํผ์ ๋ํด์๋ ์ด ๊ฐ์ ์ฌ์ฉํ ํ์๊ฐ ์์ต๋๋ค.
-
StructureByteStride
- ๊ตฌ์กฐ์ ๋ฒํผ์ ์ ์ฅ๋ ์์ ํ๋์ ํฌ๊ธฐ๋ฅผ ๋งํฉ๋๋ค.
- structured buffer ์ธ์๋ 0์ ๊ฐ์ ๊ฐ์ง๋ฉด ๋ฉ๋๋ค.
##D3D11_SUBRESOURCE_DATA##
- ์ด ๊ตฌ์กฐ์ฒด๋ ๋ฒํผ๋ฅผ ์์ฑํ ๋ ์ฌ์ฉ๋๋ ์๋ฃ๋ฅผ ์ ์ฅํฉ๋๋ค.
typedef struct D3D11_SUBRESOURCE_DATA
{
const void *pSysMem;
UINT SysMemPitch;
UINT SysMemSlicePitch;
} D3D11_SUBRESOURCE_DATA
-
pSysMem
- ์ ์ ๋ฒํผ๋ฅผ ์ด๊ธฐํํ ์๋ฃ๋ฅผ ๋ด์ ์์คํ ๋ฉ๋ชจ๋ฆฌ ๋ฐฐ์ด์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ์ ๋๋ค.
- ์ ์ n ๊ฐ๋ฅผ ๋ด๋ ์ ์ ๋ฒํผ๋ฅผ ์ด๊ธฐํํ๋ ๊ฒฝ์ฐ ๊ทธ ๋ฐฐ์ด์ ์์๊ฐ ์ ์ด๋ n๊ฐ์ฌ์ผ ํฉ๋๋ค.
-
SysMemPitch
-
SysMemSlicePitch
- ์ ์ ๋ฒํผ์์๋ ์ฌ์ฉํ์ง ์์ต๋๋ค.
##CreateBuffer ํจ์##
virtual HRESULT STDMETHODCALLTYPE CreateBuffer(
/* [annotation] */
_In_ const D3D11_BUFFER_DESC *pDesc,
/* [annotation] */
_In_opt_ const D3D11_SUBRESOURCE_DATA *pInitialData,
/* [annotation] */
_Out_opt_ ID3D11Buffer **ppBuffer
) = 0;
- pDesc
- ์์์ ์์ฑํ ๊ตฌ์กฐ์ฒด์ ํฌ์ธํฐ๋ฅผ ์ ๋ฌํฉ๋๋ค.
- ํด๋น ๊ตฌ์กฐ์ฒด์ ์ค์ ๊ฐ์ ๋ฐ๋ผ ๋ฒํผ๊ฐ ์์ฑ๋ฉ๋๋ค.
- pInitialData
- ์์์ ์์ฑํ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋กํ ๊ตฌ์กฐ์ฒด์ ํฌ์ธํฐ๋ฅผ ์ ๋ฌํฉ๋๋ค.
- ํด๋น ๊ตฌ์กฐ์ฒด์ ๊ฐ์ ๋ฐ๋ผ์ ๋ฒํผ์ ์ด๊ธฐ๊ฐ์ด ๊ฒฐ์ ๋ฉ๋๋ค.
- ppBuffer
- ์ด ํจ์๋ก ์์ฑํ ์ ์ ๋ฒํผ์ ์ฃผ์๊ฐ์ ์ ๋ฌํฉ๋๋ค.
##ID3D11DeviceContext::IASetVertexBuffers##
- ์์ ๊ณผ์ ์ ํตํด ์ ์ ๋ฒํผ๋ฅผ ์์ฑํ๋ค๋ฉด, ์ด์ ํ์ดํ๋ผ์ธ์ผ๋ก ๊ณต๊ธํ ์ฐจ๋ก์ ๋๋ค.
- ์ด๋ฅผ ์ํด์๋ ๋ฒํผ๋ฅผ ์ฅ์น์ ํ ์ ๋ ฅ ์ฌ๋กฏ์ ๋ถ์ฌ์ผ ํ๋๋ฐ, ์ด๋ฅผ ์ํ ํจ์๊ฐ IASetVertexBuffers ์ ๋๋ค.
virtual void STDMETHODCALLTYPE IASetVertexBuffers(
/* [annotation] */
_In_range_( 0, D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT - 1 ) UINT StartSlot,
/* [annotation] */
_In_range_( 0, D3D11_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT - StartSlot ) UINT NumBuffers,
/* [annotation] */
_In_reads_opt_(NumBuffers) ID3D11Buffer *const *ppVertexBuffers,
/* [annotation] */
_In_reads_opt_(NumBuffers) const UINT *pStrides,
/* [annotation] */
_In_reads_opt_(NumBuffers) const UINT *pOffsets
) = 0;
-
StartSlot
- ์ ์ ๋ฒํผ๋ฅผ ๋ถ์ผ ์ ๋ ฅ ์ฌ๋กฏ์ ์์ธ์ ๋๋ค.
- 0๋ถํฐ 15๊น์ง ์ง์ ๊ฐ๋ฅํฉ๋๋ค.
-
NumBuffers
- ์ด๋ฒ ํธ์ถ์์ ์ ๋ ฅ ์ฌ๋กฏ์ ๋ถ์ด๊ณ ์ ํ๋ ๋ฒํผ์ ๊ฐ์์ ๋๋ค.
-
ppVertexBuffers
- ๋ถ์ผ ์ ์ ๋ฒํผ๋ค์ ๋ด์ ๋ฐฐ์ด์ ์ฒซ ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ์ ๋๋ค.
-
pStrides
- stride๋ค์ ๋ฐฐ์ด์ ์ฒซ ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ์ ๋๋ค.
- stride๋, ํด๋น ์ ์ ๋ฒํผ์ ํ ์์์ ๋ฐ์ดํธ ๋จ์ ํฌ๊ธฐ์ ๋๋ค.
- sizeof(VertexType);
-
pOffsets
- offset๋ค์ ๋ฐฐ์ด์ ์ฒซ ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ์ ๋๋ค.
- offset์ด๋, ์ ์ ๋ฒํผ์ ์์ ์์น์์๋ถํฐ, ํ์ ์ ์ ์๋ฃ๋ฅผ ์ฝ๊ธฐ ์์ํ ์ ์ ๋ฒํผ๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ๋งํฉ๋๋ค.
- ์์ ๋ช ์ ์ ์ ์๋ตํ๋ ค๋ ๊ฒ์ด ์๋๋ผ๋ฉด 0๊ฐ์ ๋ฃ๋๋ก ํฉ๋๋ค.
-
ํ๋์ ์ ๋ ฅ ์ฌ๋กฏ์ ์ฌ๋ฌ ์ ์ ๋ฒํผ๋ฅผ ๋ฌถ์ ์ ์์ต๋๋ค.
-
์ผ๋จ ์ ๋ ฅ ์ฌ๋กฏ์ ๋ถ์ธ ์ ์ ๋ฒํผ๋ ๋ค์ ๋ณ๊ฒฝํ์ง ์๋ ์ด์ ํด๋น ์ ๋ ฅ ์ฌ๋กฏ์ ๊ณ์ ๋ถ์ด ์๊ฒ๋ฉ๋๋ค.
-
๊ทธ๋ฌ๋ ์ด๊ฒ๋ง์ผ๋ก ์ ์ ๋ค์ด ์ค์ ๋ก ๊ทธ๋ ค์ง๋ ๊ฒ์ ์๋๋๋ค.
##ID3D11DeviceContext::Draw##
- ์์ ํจ์๋ฅผ ํธ์ถํด์ผ ์ค์ ๋ก ์ ์ ๋ค์ ๊ทธ๋ฆฌ๊ธฐ ์ฐ์ฐ์ด ์์๋ฉ๋๋ค.
virtual void STDMETHODCALLTYPE Draw(
/* [annotation] */
_In_ UINT VertexCount,
/* [annotation] */
_In_ UINT StartVertexLocation
) = 0;
- ๋ ๋งค๊ฐ๋ณ์๋ ์ ์ ๋ฒํผ ๋ด๋ถ์ ์ฐ์๋ ์ ์ ๋ค์ ๊ตฌ๊ฐ์ ์ง์ ํฉ๋๋ค.
- VertexCount
- ๊ทธ๋ ค๋ผ ์ ์ ์ ๊ฐ์๋ฅผ ์ง์ ํฉ๋๋ค.
- StartVertexLocation
- ๊ทธ๋ฆฌ๊ธฐ ์์ํ ์ ์ ์ ์์ธ์ ์ง์ ํฉ๋๋ค.