2016-07-26 27 views
0

Ich habe 2 Effekte. Ich habe gerade begonnen, mit Shadern und DirectX zu arbeiten, tut mir leid für die blöde Frage. Erster mit compute shader in es dauert RWStructuredBuffer.ID3D11UnorderedAccessView Daten zu StructuredBuffer

RWStructuredBuffer<Particle> Particles : register(u0); 

Zweite ein:

StructuredBuffer<Particle> Particles : register(t0); 

Ich habe Daten auf diese Weise:

//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); 

Und geben:

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

Leider zweite Effekt Anfangsdaten macht, aber ich brauche um bereits geänderte Daten von c ompute Shader. Ich habe keine hilfreiche Beispiele gefunden. Vielen Dank für jede Hilfe.

Antwort

0

Ohne weitere Details, wie Sie die Puffer verwenden, ist es schwer, eine echte Lösung zu geben. Aber was ist seltsam ist, dass Sie zwei Puffer haben, einer ist nur uav, während der andere nur srv! Was Sie stattdessen haben sollten, ist ein Puffer für Inplace-Update, oder zwei machen einen Ping-Pong, das sind uav AND srv, so können Sie zuerst mit dem UAV aktualisieren und dann als srv verwenden, um die Partikel zu rendern.