Как передать результат из вычислительного шейдера в вершинный шейдер?

Мой код сработал.
Во-первых, я создаю буфер для получения буфера из вычислительного шейдера с помощью CopyResource.

Затем я создаю указатель вызова p1 и получить указатель результата из MappedResource1.
После этого я создаю буфер вершин и визуализирую.

Но я не думаю, что это лучший способ получить вершинный буфер из вычислительного шейдера:

D3D11_BUFFER_DESC desc;
ZeroMemory(&desc, sizeof(desc));
mFirstBuffer->GetDesc(&desc);
desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
desc.Usage = D3D11_USAGE_STAGING;
desc.BindFlags = 0;
desc.MiscFlags = 0;
if (SUCCEEDED(device->CreateBuffer(&desc, nullptr, &debugbuf)))
{
    context->CopyResource(debugbuf, mFirstBuffer.Get());
}
unsigned int stride = sizeof(InstanceData);
unsigned int offset = 0;
D3D11_MAPPED_SUBRESOURCE MappedResource1;
InstanceData *p1;

context->Map(debugbuf, 0, D3D11_MAP_READ, 0, &MappedResource1);
p1 = (InstanceData*)MappedResource1.pData;
context->Unmap(debugbuf, 0);

D3D11_SUBRESOURCE_DATA VertexBufferData;
VertexBufferData.pSysMem = p1;
VertexBufferData.SysMemPitch = 0;
VertexBufferData.SysMemSlicePitch = 0;
D3D11_BUFFER_DESC desc2;
desc2.ByteWidth = sizeof(InstanceData) * MillionParticleCount;
desc2.Usage = D3D11_USAGE_DEFAULT;
desc2.BindFlags = D3D11_BIND_VERTEX_BUFFER;
desc2.CPUAccessFlags = 0;
desc2.MiscFlags = 0;
desc2.StructureByteStride = 0;
device->CreateBuffer(&desc2, &VertexBufferData, &vertexBuffer);

context->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset);

Я прочитал много примеров, все они пишут compute shader и vertex shader вместе только в одном файле, и поэтому они могут получить результат от compute shader напрямую.

В моем коде вычислительный шейдер и вершинный шейдер записываются в разные файлы.
Как оптимизировать код?

1 ответ