2016-07-26 4 views
0

2 가지 효과가 있습니다. 방금 쉐이더와 DirectX로 작업하기 시작했습니다. 어리석은 질문으로 인해 미안합니다. 계산 쉐이더가있는 Firts 하나에는 RWStructuredBuffer가 필요합니다.ID3D11UnorderedAccess StructuredBuffer에 데이터보기

RWStructuredBuffer<Particle> Particles : register(u0); 

두 번째는 :

StructuredBuffer<Particle> Particles : register(t0); 

나는 데이터를 이런 식으로 만들어 :

//creating buffer for initial particles 
D3D11_BUFFER_DESC cbDesc = {}; 
cbDesc.ByteWidth = sizeof(Particle)*PARTICLES_COUNT; 
cbDesc.Usage = D3D11_USAGE::D3D11_USAGE_DEFAULT; 
//cbDesc.BindFlags = D3D11_BIND_FLAG::D3D11_BIND_UNORDERED_ACCESS & D3D11_BIND_FLAG::D3D11_BIND_SHADER_RESOURCE; 
cbDesc.BindFlags = D3D11_BIND_FLAG::D3D11_BIND_SHADER_RESOURCE; 
cbDesc.CPUAccessFlags = 0; 
cbDesc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED; 
cbDesc.StructureByteStride = sizeof(Particle); 

D3D11_BUFFER_DESC cbuavDesc = {}; 
cbuavDesc.ByteWidth = sizeof(Particle)*PARTICLES_COUNT; 
cbuavDesc.Usage = D3D11_USAGE::D3D11_USAGE_DEFAULT; 
//cbuavDesc.BindFlags = D3D11_BIND_FLAG::D3D11_BIND_UNORDERED_ACCESS & D3D11_BIND_FLAG::D3D11_BIND_SHADER_RESOURCE; 
cbuavDesc.BindFlags = D3D11_BIND_FLAG::D3D11_BIND_UNORDERED_ACCESS; 
cbuavDesc.CPUAccessFlags = 0; 
cbuavDesc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED; 
cbuavDesc.StructureByteStride = sizeof(Particle); 

// Fill in the subresource data. 
D3D11_SUBRESOURCE_DATA InitData = {}; 
InitData.pSysMem = &initialParticles; 
InitData.SysMemPitch = sizeof(Particle)*PARTICLES_COUNT; 
InitData.SysMemSlicePitch = 0; 

hr = g_pd3dDevice->CreateBuffer(&cbDesc, &InitData, &solverParticles); 
hr = g_pd3dDevice->CreateBuffer(&cbuavDesc, &InitData, &solverUAVParticles); 

D3D11_UNORDERED_ACCESS_VIEW_DESC uvDesc = {}; 
uvDesc.Buffer.FirstElement = 0; 
uvDesc.Buffer.NumElements = PARTICLES_COUNT; 
uvDesc.Buffer.Flags = D3D11_BUFFER_UAV_FLAG_COUNTER; 
uvDesc.Format = DXGI_FORMAT_UNKNOWN; 
uvDesc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER; 

D3D11_SHADER_RESOURCE_VIEW_DESC svDesc = {}; 
svDesc.Buffer.NumElements = PARTICLES_COUNT; 
svDesc.Buffer.FirstElement = 0; 
svDesc.Format = DXGI_FORMAT_UNKNOWN; 
svDesc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER; 


hr = g_pd3dDevice->CreateUnorderedAccessView(solverUAVParticles, &uvDesc, &g_uav); 
hr = g_pd3dDevice->CreateShaderResourceView(solverParticles, &svDesc, &g_particlesStructuredBufferView); 

을 그리고 통과 :

hr = g_particlesUAV->SetUnorderedAccessView(g_uav); 
hr = g_particlesStructuredBuffer->SetResource(g_particlesStructuredBufferView); 

불행하게도 두 번째 효과는 초기 데이터를 렌더링,하지만 난 필요 이미 변경된 데이터를 c에서 렌더링하기 ompute 쉐이더. 도움이되는 샘플을 찾지 못했습니다. 도움을 주셔서 감사합니다.

답변

0

버퍼 사용 방법에 대한 자세한 내용이 없으면 실제 솔루션을 제공하기가 어렵습니다. 하지만 이상한 점은 버퍼가 두 개인다는 것입니다. 하나는 uav이고 다른 하나는 srv입니다. 대신에 inplace update를위한 하나의 버퍼 또는 up와 srv 인 ping pong을하는 두 개의 버퍼가 있어야합니다. 그러면 먼저 uv로 업데이트 한 다음 srv로 입자를 렌더링 할 수 있습니다.