2013-11-24 6 views
0

계산 쉐이더를 사용하여 삼각형 목록을 계산하고 RWStructuredBuffer에 저장합니다. 테스트를 위해이 버퍼를 읽고 context.InputAssembler.SetVertexBuffers (…)을 통해 IA로 전달합니다. 이 접근법은 작동하지만 데이터의 정확성을 테스트 할 때만 유효합니다.GPU에있는 버퍼 리소스를 입력 어셈블러 (IA)에 어떻게 바인딩 할 수 있습니까?

이제 리소스 뷰 (정점 버퍼에 대한 포인터를 전달하지 않고)를 사용하여 (이미 존재하는) 버퍼를 IA 스테이지에 바인딩하고 싶습니다.

저는 좋은 책 (프랭크 D. 루나, 제이슨 징크)을 읽었지만,이 사례는 언급하지 않았습니다.

=============== 편집 :

  1. 나는 SharpDX 래퍼에 의해 부과 여기에 사용하고 구문.

  2. ResoureceView를 바인딩하여 context.VertexShader.SetShaderResource(...)을 통해 버텍스 쉐이더에 버퍼를 바인딩 할 수 있습니다. VS에서 저는 SV_VertexID을 사용하여 버퍼에 접근합니다. 그래서 나는 잠시 동안 실용적인 해결책을 가지고 있지만, 앞으로 버퍼를 입력 어셈블러에 바인드해야 할 경우가있을 수 있습니다.

답변

1

간단히 말해, 적어도 직접 구조화 된 버퍼를 IA 단계에 바인딩 할 수는 없으며 런타임에서는이를 허용하지 않습니다.

ResourceFree.BufferStructured를 OptionFlags로 넣으면 바인드 플래그로 VertexBuffer/IndexBuffer/StreamOutput/ConstantBuffer/RenderTarget/Depth를 사용할 수 없으므로 자원 생성이 실패합니다.

GPU 복사 비용이 드는 한 가지 옵션은 VertexBuffer BindFlags 및 기본 사용 (구조화 된 버퍼와 동일한 크기)을 사용하여 두 번째 버퍼를 만드는 것입니다. DeviceContext.CopyResource

그리고 당신이 사용하는 표준 정점 버퍼를 준비해야합니다 : 당신이 당신의 structuredbuffer을 처리 완료되면

는, 호출합니다.

+0

약간 혼란 스러워요. context.InputAssembler.SetVertexBuffers를 사용하여 실제로 구조화 된 버퍼를 IA 스테이지에 바인딩했으며 입력 레이아웃을 해당 구조로 정확하게 설정했습니다. 많은 샘플이이 설정을 사용합니다. 당신이 제안한 복사본을 만들 수 있다면, 어떻게이 새로운 버퍼를 IA 스테이지에 바인딩 할 수 있습니까? DrawIndirect 호출 중 하나를 사용합니까? –

+0

miniTri SharpDX 샘플보기 HLSL : 구조체 VS_IN { \t float4 pos : POSITION; \t float4 col : COLOR; }; C 번호 : VAR 레이아웃 = 새로운 InputLayout (디바이스 특성, 새로운 [] { 새로운 InputElement ("POSITION"0 Format.R32G32B32A32_Float, 0, 0), 새로운 InputElement ("COLOR", 0, Format.R32G32B32A32_Float, 16, 0) }); 은 구조화 된 버퍼처럼 보입니다 ... –

+0

많은 샘플이 버퍼를 바인딩하지만 생성에는 BufferStructured 플래그가 없으므로 작동합니다. 버퍼를 버텍스 1에 복사하면, 버텍스 개수를 알아야하기 때문에 평소와 같이 바인딩 할 수 있습니다. 그리고 왜 dx runtime이 이것을 허용하지 않는지 모르겠다. 정말 편리 할 것이다. – catflier