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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top