我有两个效果。我刚刚开始使用着色器和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);不幸的是,second effect渲染了初始数据,但我需要从计算着色器渲染已经更改的数据。我还没有找到任何有用的样本。非常感谢你的帮助。
发布于 2016-07-28 06:05:18
如果没有更多关于如何使用缓冲区的细节,就很难给出一个真正的解决方案。但是奇怪的是你有两个缓冲区,一个只有无人机,而另一个只有srv!相反,您应该有一个用于就地更新的缓冲区,或两个用于乒乓的缓冲区,这两个缓冲区是uav和srv,因此您可以首先使用uav进行更新,然后将其用作srv来渲染粒子。
https://stackoverflow.com/questions/38594388
复制相似问题