IndexBuffer - Noanswers/shipman GitHub Wiki

μ•žμ„œ 정점 버퍼에 λŒ€ν•œ λ‚΄μš©μ„ λ³Έ λ‹€μŒμ— μ§„ν–‰ν•˜μ‹œκΈΈ λ°”λžλ‹ˆλ‹€. 정점 λ²„νΌλ§Œ μ‚¬μš©ν•˜λŠ” 경우, λ‹¨μˆœν•œ μ‚¬κ°ν˜•μ„ 그리기 μœ„ν•΄μ„œ 정점을 6κ°œλ‚˜ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. 폴리곀이 λ³΅μž‘ν•΄μ§€λŠ” 경우, μ€‘λ³΅λ˜λŠ” μ •μ μ˜ μˆ˜λŠ” νœ μ”¬ 더 λ§Žμ•„ 질 κ²ƒμž…λ‹ˆλ‹€. 이와 같은 λΆˆν•©λ¦¬ν•œ 상황을 κ°œμ„ ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” 것이 index buffer μž…λ‹ˆλ‹€.

index buffer λ˜ν•œ, μ΄λ¦„μ—μ„œ μ•Œ 수 μžˆλ“―μ΄ 버퍼에 μ €μž₯ν•˜λŠ” 값이기에 정점 버퍼와 μœ μ‚¬ν•œ λ°©λ²•μœΌλ‘œ μƒμ„±ν•©λ‹ˆλ‹€.

  1. D3D11_BUFFER_DESC ꡬ쑰체λ₯Ό μ΄μš©ν•˜μ—¬ μ„ΈλΆ€ 사항을 κ²°μ •ν•©λ‹ˆλ‹€.
    • BindFlags 값을 D3D11_BIND_INDEX_BUFFER둜 μ§€μ •ν•˜λŠ” 것 외에 큰 차이점은 μ—†μŠ΅λ‹ˆλ‹€.
  2. D3D11_SUBRESOURCE_DATA ꡬ쑰체λ₯Ό μ΄μš©ν•˜μ—¬ μ΄ˆκΈ°ν™”ν•  인덱슀의 정보λ₯Ό μ „λ‹¬ν•©λ‹ˆλ‹€.
  3. CreateBuffer ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 버퍼λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

μ—¬κΈ°κΉŒμ§€λŠ” 맀우 λ™μΌν•©λ‹ˆλ‹€.

##ID3D11DeviceContext::IASetIndexBuffer ν•¨μˆ˜##

  • IASetVertexBuffers ν•¨μˆ˜μ™€ μœ μ‚¬ν•œ 역할을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  • index bufferλ₯Ό νŒŒμ΄ν”„λΌμΈμ— λ¬Άμ–΄μ€λ‹ˆλ‹€.
virtual void STDMETHODCALLTYPE IASetIndexBuffer(
    /* [annotation] */ 
    _In_opt_  ID3D11Buffer *pIndexBuffer,
    /* [annotation] */ 
    _In_  DXGI_FORMAT Format,
    /* [annotation] */ 
    _In_  UINT Offset
) = 0;
  • pIndexBuffer
    • 인덱슀 λ²„νΌμ˜ μ£Όμ†Œλ₯Ό μ „λ‹¬ν•΄μ€λ‹ˆλ‹€.
  • Format
    • 각 인덱슀의 ν˜•μ‹μ„ λœ»ν•©λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄ unsigned intλ₯Ό μ‚¬μš©ν•˜μ—¬ 인덱슀λ₯Ό μ§€μ •ν•˜λŠ” 경우 DXGI_FORMAT_R32_UINT 값을 μ§€μ •ν•˜λ©΄ λ©λ‹ˆλ‹€.
    • D3D11_BUFFER_DESC.BandWidth 에 μ§€μ •ν•œ 크기와 μΌμΉ˜ν•˜λ„λ‘ 신경써주어야 ν•©λ‹ˆλ‹€.
  • Offset
    • 인덱슀λ₯Ό 읽기 μ‹œμž‘ν•  μœ„μΉ˜λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.

##ID3D11DeviceContext::DrawIndexed ν•¨μˆ˜##

  • 인덱슀λ₯Ό μ΄μš©ν•˜λŠ” 경우 Draw ν•¨μˆ˜κ°€ μ•„λ‹ˆλΌ DrawIndexed ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.
virtual void STDMETHODCALLTYPE DrawIndexed(
    /* [annotation] */ 
    _In_  UINT IndexCount,
    /* [annotation] */ 
    _In_  UINT StartIndexLocation,
    /* [annotation] */ 
    _In_  INT BaseVertexLocation
) = 0;
  • IndexCount
    • draw ν•¨μˆ˜μ— μ‚¬μš©ν•  인덱슀의 κ°―μˆ˜μž…λ‹ˆλ‹€.
  • StartIndexLocation
    • μ‚¬μš©ν•  첫 인덱슀의 μœ„μΉ˜μž…λ‹ˆλ‹€.
  • BaseVertexLocation
    • 정점듀을 κ°€μ Έμ˜€κΈ° 전에, ν•΄λ‹Ή ν˜ΈμΆœμ—μ„œ μ‚¬μš©ν•  색인듀에 λ”ν•΄μ§€λŠ” μ •μˆ˜ κ°’μž…λ‹ˆλ‹€.

μ΄λŸ¬ν•œ λ§€κ°œλ³€μˆ˜λ“€μ€, ν•˜λ‚˜μ˜ 정점버퍼λ₯Ό μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ 폴리곀을 κ·Έλ¦¬λŠ”λ° μ•„μ£Ό μœ μš©ν•©λ‹ˆλ‹€.