Считывание выходных данных из геометрического шейдера на процессоре
-
21-09-2019 - |
Вопрос
Я пытаюсь прочитать выходные данные из геометрического шейдера, который использует потоковый вывод для вывода в буфер.
Выходной буфер, используемый геометрическим шейдером, описывается следующим образом:
D3D10_BUFFER_DESC vbdesc =
{
numPoints * sizeof( MESH_VERTEX ),
D3D10_USAGE_DEFAULT,
D3D10_BIND_VERTEX_BUFFER | D3D10_BIND_STREAM_OUTPUT,
0,
0
};
V_RETURN( pd3dDevice->CreateBuffer( &vbdesc, NULL, &g_pDrawFrom ) );
Геометрический шейдер создает несколько треугольников на основе одной точки (максимум 12 треугольников на точку), и, если я правильно понимаю SDK, мне нужно создать промежуточный ресурс, чтобы прочитать выходные данные геометрического шейдера на процессоре.
Я объявил другой буферный ресурс (на этот раз установив ПРОМЕЖУТОЧНЫЙ флаг) следующим образом:
D3D10_BUFFER_DESC sbdesc =
{
(numPoints * (12*3)) * sizeof( VERTEX_STREAMOUT ),
D3D10_USAGE_STAGING,
NULL,
D3D10_CPU_ACCESS_READ,
0
};
V_RETURN( pd3dDevice->CreateBuffer( &sbdesc, NULL, &g_pStaging ) );
После первого вызова draw приложения геометрический шейдер завершает создание всех треугольников и может быть отрисован.Однако после этого первого вызова draw я хотел бы иметь возможность считывать вершины, выводимые геометрическим шейдером.
Используя промежуточный ресурс buffer, я пытаюсь сделать это следующим образом (сразу после первого вызова draw):
pd3dDevice->CopyResource(g_pStaging, g_pDrawFrom]);
pd3dDevice->Flush();
void *ptr = 0;
HRESULT hr = g_pStaging->Map( D3D10_MAP_READ, NULL, &ptr );
if( FAILED( hr ) )
return hr;
VERTEX_STREAMOUT *mv = (VERTEX_STREAMOUT*)ptr;
g_pStaging->Unmap();
Это компилируется и не выдает никаких ошибок во время выполнения.Однако, похоже, я не получаю никакого результата.
Геометрический шейдер выводит следующее:
struct VSSceneStreamOut
{
float4 Pos : POS;
float3 Norm : NORM;
float2 Tex : TEX;
};
и VERTEX_STREAMOUT объявляется следующим образом:
struct VERTEX_STREAMOUT
{
D3DXVECTOR4 Pos;
D3DXVECTOR3 Norm;
D3DXVECTOR2 Tex;
};
Я что-то здесь упускаю?
Решение
Проблема решается путем создания промежуточного буфера ресурсов следующим образом:
D3D10_BUFFER_DESC sbdesc;
ZeroMemory( &sbdesc, sizeof(sbdesc) );
g_pDrawFrom->GetDesc( &sbdesc );
sbdesc.CPUAccessFlags = D3D10_CPU_ACCESS_READ;
sbdesc.Usage = D3D10_USAGE_STAGING;
sbdesc.BindFlags = 0;
sbdesc.MiscFlags = 0;
V_RETURN( pd3dDevice->CreateBuffer( &sbdesc, NULL, &g_pStaging ) );
Проблема была с byteWidth.