Leseausgabe von Geometrie-Shader auf CPU
-
21-09-2019 - |
Frage
Ich versuche, die Ausgabe von einem Geometrie-Shader zu lesen, die an einem Pufferstrom-Ausgang zur Ausgabe verwendet wird.
Der Ausgabepuffer durch den Geometrie-Shader verwendet wird wie folgt beschrieben:
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 ) );
Die Geometrie-Shader erzeugt eine Anzahl der Dreiecke auf einem einzigen Punkt basiert (bei max 12 Dreiecke pro Punkt), und wenn ich das SDK richtig verstanden habe ich eine Staging-Ressource zu schaffen, um die Ausgabe von der Geometrie-Shader zu lesen auf die CPU.
Ich habe einen weiteren Puffer Ressource deklariert (diesmal die STAGING-Flags) wie folgt aus:
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 ) );
Nach dem ersten Zeichenaufruf der Anwendung der Geometrie-Shader erfolgt alle Dreiecke zu schaffen und gezogen werden können. Doch nach diesem ersten Zeichenaufruf Ich möchte in der Lage sein, den Eckpunkten Ausgang durch die Geometrie-Shader zu lesen.
Mit der Puffer-Staging-Ressource Ich versuche, es so zu tun (gleich nach dem ersten Zeichenaufruf):
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();
Dies kompiliert und nicht gibt keine Fehler zur Laufzeit. Aber ich scheine keine Ausgabe zu erhalten.
Die Geometrie-Shader gibt die folgende:
struct VSSceneStreamOut
{
float4 Pos : POS;
float3 Norm : NORM;
float2 Tex : TEX;
};
und die VERTEX_STREAMOUT wird wie folgt erklärt:
struct VERTEX_STREAMOUT
{
D3DXVECTOR4 Pos;
D3DXVECTOR3 Norm;
D3DXVECTOR2 Tex;
};
Bin ich etwas fehlt hier?
Lösung
Problem gelöst, indem die Staging-Ressource-Puffer wie folgt zu erstellen:
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 ) );
Das Problem war mit dem ByteWidth.