У меня есть 2 эффекта. Я только начал работать с шейдерами и DirectX, так что извините за глупый вопрос.
Первый с вычислительным шейдером занимает RWStructuredBuffer.
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);
К сожалению, второй эффект рендерит исходные данные, но мне нужно рендерить уже измененные данные из вычислительного шейдера. Я не нашел никаких полезных образцов.
Большое спасибо за любую помощь.
Без более подробной информации о том, как вы используете буферы, трудно дать реальное решение. Но что странно, так это то, что у вас есть два буфера, один только uav, а другой только srv! Вместо этого у вас должен быть один буфер для обновления на месте или два для пинг-понга, которые представляют собой uav AND srv, так что вы можете сначала обновить с помощью uav, а затем использовать в качестве srv для рендеринга частиц.
Других решений пока нет …