VertexBuffer - Noanswers/shipman GitHub Wiki

GPU๊ฐ€ ์ •์  ๋ฐฐ์—ด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ ค๋ฉด, ๋ฐฐ์—ด๋“ค์˜ ์ •์ ๋“ค์„ ๋ฒ„ํผ์— ๋‹ด์•„๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฒ„ํผ๋“ค์€ ์ •์  ๋“ฑ์˜ ์ž๋ฃŒ๋งŒ ๋‹ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ CPU๋‚˜ GPU๊ฐ€ ํ•ด๋‹น ์ž๋ฃŒ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ• ๋“ฑ์˜ ์ •๋ณด๋„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ID3D11Buffer ๊ตฌ์กฐ์ฒด๊ฐ€ ์ด ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ ์ค‘ ์ •์ ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๋ฒ„ํผ๋ฅผ ์ •์  ๋ฒ„ํผ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์ •์  ๋ฒ„ํผ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ์˜ ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ƒ์„ฑํ•  ๋ฒ„ํผ๋ฅผ ์„œ์ˆ ํ•˜๋Š” D3D11_BUFFER_DESC ๊ตฌ์กฐ์ฒด๋ฅผ ์ฑ„์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ฒ„ํผ์˜ ์ดˆ๊ธฐํ™”์— ์‚ฌ์šฉํ•  ์ž๋ฃŒ๋ฅผ ์„œ์ˆ ํ•˜๋Š” D3D11_SUBRESOURCE_DATA ๊ตฌ์กฐ์ฒด๋ฅผ ์ฑ„์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. 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
    • ๊ทธ๋ฆฌ๊ธฐ ์‹œ์ž‘ํ•  ์ •์ ์˜ ์ƒ‰์ธ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.