Domanda

Sto cercando di leggere l'output di uno shader geometria che sta usando stream-output per l'output a un buffer.

Il buffer di uscita utilizzata dall'ombreggiatore geometria è descritto in questo modo:

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 ) );

Il geometry shader crea una serie di triangoli in base a un unico punto (al massimo 12 triangoli al punto), e se ho capito l'SDK correttamente devo creare una risorsa messa in scena per leggere l'uscita dal geometry shader su la CPU.

Ho dichiarato un'altra risorsa di buffer (questo impostando il flag STAGING tempo) in questo modo:

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 ) );

Dopo la prima chiamata sorteggio dell'applicazione del geometry shader viene eseguita la creazione di tutti i triangoli e si possono trarre. Tuttavia, dopo questo primo invito pareggio mi piacerebbe essere in grado di leggere l'output vertici dal geometry shader.

Uso della risorsa buffer di messa in scena che sto cercando di fare in questo modo (a destra dopo la prima chiamata sorteggio):

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(); 

Questa compila e non dà errori in fase di esecuzione. Tuttavia, non mi sembra di avere alcun output.

Lo shader geometria emette il seguente:

struct VSSceneStreamOut 
{ 
    float4 Pos  : POS; 
    float3 Norm : NORM; 
    float2 Tex  : TEX;   
}; 

e il VERTEX_STREAMOUT è dichiarato in questo modo:

struct VERTEX_STREAMOUT 
{ 
    D3DXVECTOR4 Pos; 
    D3DXVECTOR3 Norm; 
    D3DXVECTOR2 Tex; 
}; 

Mi sto perdendo qualcosa qui?

È stato utile?

Soluzione

Problema risolto creando buffer risorsa staging in questo modo:

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 ) );

Il problema era con il ByteWidth.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top