2017-02-14 9 views
1

두 개의 다른 메쉬에 대해 두 개의 버텍스 버퍼를 생성한다고 가정 해 보겠습니다.DirectX 11에서 인덱스 버퍼 사용. 어떻게 알 수 있습니까?

 (I'm assuming creating separate buffers for separate meshes is how it's usually done) 

자, 인덱스 버퍼를 사용하여 메시 중 하나를 그려야한다고 가정 해 봅시다. Direct3D 11의 실용적인 렌더링 및 계산 인덱스 버퍼를 어떤 방식 으로든 참조하는 것은 인덱스 버퍼를 만드는 것처럼 보이지 않으므로 인덱스 버퍼는 (입력 어셈블리 중에) 어떤 버텍스 버퍼가 작동 하는지를 어떻게 알 수 있습니까? ?

나는 답이없는 인터넷 검색을 한 적이 있는데, 이는 내가 누락 된 부분이 있다는 것을 분명히 추측합니다.

답변

2

맞아요, 인덱스 버퍼는 특정 버텍스 버퍼를 참조하지 않습니다. DrawIndexed 동안 활성 인덱스 버퍼는 활성 버텍스 버퍼 (SetIndexBuffer/SetVertexBuffers를 사용하여 설정 한 버퍼)에 인덱스를 제공하는 데 사용됩니다.

+0

나는 그것을 알지 못했다. 그렇다면 별도의 메쉬를위한 별도의 버퍼를 가지고 있다는 가정하에 올바른 가정이 무엇입니까? 하나의 장면이 정적 인 소품과 같은 특정 메쉬에 유용 할 수 있다는 것을 이해합니다. 그러나 일반적으로 좋거나 나쁜 습관입니까? 얼마나 많은 사람이 사용할 수 있는지/사용할 수 있는지에 대한 제한이 있습니까? –

+1

여러 가지 방법으로 VB/IB를 구성 할 수 있습니다. 중요한 문제는 소재 설정이 드로잉 사이에서 변경되어야하기 때문에 각 '메쉬 서브 세트'를 별개의 드로잉으로 제출할 수 있어야한다는 것입니다.[하드웨어 제한] (https://blogs.msdn.microsoft.com/chuckw/2012/06/20/direct3d-feature-levels/) 내에서 전체 레벨에 하나의 VB와 IB를 사용할 수도 있습니다. DirectX를 처음 사용하는 경우 간단한 작업 만 수행하면됩니다. BTW, [DirectX Tool Kit] (https://github.com/Microsoft/DirectXTK/wiki/Getting-Started)를보십시오. –

+1

@EliasFinoli 성능면에서 가장 좋은 방법은 DI 호출 수를 줄이는 것입니다. 즉, VB/IB를 연결하여 하나의 호출로 렌더링하여 버텍스 레이아웃, 일부 텍스처 및 일부 셰이더를 공유하는 메시를 그룹화하는 일괄 처리를 줄이는 것입니다. 가장 일반적인 일괄 처리 전략은 없으며 장면, 대상 하드웨어 기능 등에 따라 다릅니다. 일부 기술은 [여기] (https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch28.html)에 나와 있습니다. – w1ck3dg0ph3r

1

사실 인덱스 버퍼와 버텍스 버퍼는 완전히 독립적입니다.

색인 버퍼는 드로잉 (Drawing)시에 VertexBuffer에 대해 알아야합니다 (예 :시 파이프 라인에 모두 같은 바운드)

당신은 당신이 목록 또는 요소 인덱스를 유지는 "조회 테이블"로 색인 버퍼 생각할 수

무승부.

또한 완전히 "논리적으로 관련이없는"버퍼를 파이프 라인에 연결하여 그릴 수 있음을 의미합니다. 그렇게하지 못하게하는 것은 아니지만, 이상한 시각적 결과를 가져올 수 있습니다.

  • 당신은 색인 버퍼를 재사용 할 수있다 (예를 들어, 동일한 해상도의 두 변위 된 격자가 동일한 색인 버퍼를 공유 할 수있다) :

    디커플링 모두 갖는 많은 장점은 여기서 몇 가지 예이다. 괜찮은 메모리가 될 수 있습니다.

  • 버텍스 버퍼를 자체적으로 그릴 수 있고 버텍스별로 처리 할 수 ​​있습니다 (예 : 스프라이트에 대한 포인트 목록을 그리거나 스트림 출력 버퍼에 스키닝/디스플레이 스먼트를 적용한 다음 DrawIndexed를 사용하여 결과 정점 버퍼를 그릴 수 있음)
  • Vertex/Index 버퍼를 모두 ByteAddressBuffer로 바인딩 할 수 있으므로 Compute Shader에서 지오메트리를 처리하고 다른 최적화 된 인덱스 버퍼를 생성 할 수 있습니다. 예를 들어, 추출 된 삼각형을 사용하여 인덱싱 된 Draw를 최적화 된 버퍼로 처리 할 수 ​​있습니다. 꼭지점 대신 색인을 사용하여이 컬스를 적용하는 것은 정점보다 훨씬 빠릅니다. 메모리를 훨씬 적게 이동해야하기 때문입니다.
  • 이것은 틈새 경우이지만 때로는 메쉬를 삼각형 세트로 그려야하지만 일련의 선 (와이어 프레임의 일부 양식)으로 그려야합니다. 예를 들어 하나의 Box를 가져 가면 대각선을 선으로 그리지 않으려 고합니다. 따라서 상자 꼭지점이있는 공유 Vertexbuffer와 삼각형 목록 그리기 전용 IndexBuffer 및 선 목록을 그릴 수있는 IndexBuffer가 있습니다. 대형 모델의 경우이 또한 효과적인 메모리 게인이 될 수 있습니다.