2011-04-01 4 views
4

약간의 배경 : 실시간 프로파일 데이터를 기반으로 오브젝트의 3D 표현을 그리는 C++ 프로젝트에서 작업하고 있습니다. 프로파일 링 데이터는 외부 프로파일 링 하드웨어에서 수집됩니다. 시스템은 객체를 따라 이동하며 초당 300 회 속도로 내 소프트웨어에 프로파일 슬라이스를 제공합니다. 각 슬라이스는 ~ 8000 개의 X-Y 포인트 목록으로 구성됩니다. 프로파일 러의 움직임은 엔코더에 의해 기록됩니다. 인코더 정보는 스캔의 3 차원을 제공합니다.DirectX 10에서 정점 버퍼를 올바르게 업데이트하는 방법

또 다른 중요한 점은 프로파일 러가 객체 위로 앞뒤로 움직일 수 있다는 것입니다. 이런 일이 발생하면 이전에 읽은/그려진 슬라이스를 새로운 엔코더 위치를 기준으로 새 슬라이스로 대체하려고합니다. 현재 엔코더 카운트만큼 저장하는 조각의 순환 버퍼로이 작업을 수행하고 있습니다. 이것은 또한 버퍼가 채워지고 오래된 슬라이스를 덮어 쓰면서 슬라이스를 버리고 싶다는 것을 의미합니다. 화면에 피사체의 적절한 양을 보여주기 위해 - 나는 한 번에 1000 개의 프로필 데이터 조각을 그려야합니다. 지금은 객체를 점군으로 렌더링하고 있습니다. 앞으로는 인접한 슬라이스를 첨부하여 삼각형 목록으로 렌더링하려고 시도 할 수 있습니다.

저는 DirectX에 익숙하지 않지만 책과 온라인 예제를 사용하여 객체를 3D로 그려야 할 시점에 이르렀지만 꼭 효율적으로/꼭지점 버퍼를 사용하지 않는다고 확신합니다. 매우 정적 인 모델에서 작동하는 대부분의 예제가 있습니다. 따라서 그들은 포인트 목록으로 단일 버텍스 버퍼를 생성하는 경향이 있으며 매트릭스 변환에 의해서만 조작됩니다. 반면에 저는 하드웨어에서 프로파일 데이터를 검색 할 때 장면을 매우 빠르게 업데이트 할 것입니다.

현재 내가 읽는 각 슬라이스에 대해 새로운 버텍스 버퍼를 생성하고 있습니다. 장면을 그릴 때 최대 1000 개의 버퍼 목록을 반복하고 각각에 대해 Draw()를 호출합니다. 한 번에 그려지는 Vertex Buffer의 수를 반으로 줄이면 FPS가 크게 증가하는 반면, Buffer 당 Vertex Points의 수를 반으로 줄이면 약간의 향상이 있었음을 알았습니다. 그래서 여러 Vertex Buffer 이것에 접근하는 적절한 방법이 아닙니다.

그래서 내 질문의 배짱 ... 내가 정점이 너무 자주 변경되면 하나의 정점 버퍼에 모든 정점을 넣을 수 있는지 궁금하네요. 기존 버텍스 버퍼 내의 포인트를 업데이트 할 수 있습니까? 아니면 장면을 업데이트 할 때마다 새로운 단일 버퍼를 다시 만들어야합니까? 마지막으로 염두에 두어야 할 점은 하드웨어에서 슬라이스 당 포인트 수가 달라 지므로 이전 슬라이스를 덮어 쓸 때 새로운 슬라이스에 교체 할 슬라이스보다 더 많거나 적은 포인트가있을 수 있다는 것입니다.

감사합니다. 어떤 조언을 많이 주시면 감사하겠습니다!

답변

3

버퍼를 동적으로 만드는 한 항상 정점 버퍼 내의 점을 업데이트 할 수 있습니다 (D3D10_USAGE_DYNAMIC을 지정하고 ID3D10Device::CopySubresourceRegion을 사용하면 버퍼의 일부만 효율적으로 업데이트 할 수 있음). 버퍼를 너무 자주 다시 만드는 것보다 더 효율적이어야합니다.

그러나 각 슬라이스마다 다른 크기를 갖는 것은 좋지 않습니다. 버텍스 버퍼의 전반적인 단편화를 낮추기 위해 일종의 메모리 관리자를 구현할 수도 있고, 여러 vb를 사용해야하는 것이 불가피 할 수도 있습니다. 한 가지 방법은 합리적인 한도까지 모든 슬라이스 크기를 반올림하고 각 크기에 대해 하나의 VB를 사용하는 것입니다.

+0

응답 해 주셔서 감사합니다. 동적 버퍼를 사용하라는 귀하의 제안은 매우 유망한 것으로 들립니다. 슬라이스 당 가변 포인트 수를 갖는 것에 관해서는, 버퍼 내에서 널 또는 미사용 정점 사이의 간격을 지정하는 방법이 있습니까? IASetVertexBuffers를 사용하면 여러 버퍼를 설정할 수 있으며 각 버퍼 내의 정점을 그릴 수 있습니다. 하나의 버퍼 내에서 특정 범위를 지정하는 것과 비슷한 옵션을 사용하기를 바라고 있었지만 지금까지는 그와 같은 것을 찾지 못했습니다. –

+0

그냥 그대로 둘 수 있고 간격 영역을 그리지 않습니까? –

+1

더 많은 검색과 읽기를 한 후에 많은 사람들이 UpdateSubresource를 사용하여 Vertex Buffer의 일부를 업데이트하고 VB가 동적 일 필요가 없다고 제안하는 것을 발견했습니다. MSDN (http://msdn.microsoft.com/en-us/library/bb173621.aspx)의 설명서를 읽었지만 전달할 매개 변수를 설정하는 적절한 방법을 이해하는 데 어려움을 겪고 있습니다. 이 방법 - 특히 _pDstBox_, _SrcRowPitch_ 및 _SrcDepthPitch_ 매개 변수 내 정점 버퍼는 1 백만 정점 길이입니다 (1000 '슬라이스와 1000 슬라이스 당 최대 점). 이 방법을 사용해 본 적이 있습니까? 감사. –

관련 문제