Question

Je suis en train de lire la sortie d'un nuanceur géométrique qui utilise courant-sortie pour délivrer en sortie à un tampon.

Le tampon de sortie utilisé par le nuanceur géométrique est décrite comme suit:

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

Le geometry shader crée un certain nombre de triangles en fonction d'un seul point (au maximum 12 triangles par point), et si je comprends le SDK correctement, je dois créer une ressource de mise en scène afin de lire la sortie du geometry shader sur la CPU.

Je l'ai déclaré une autre ressource tampon (cette fois-ci définissant l'indicateur STAGING) comme ceci:

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

Après le premier appel d'étirage de l'application du nuanceur géométrique se fait la création de tous les triangles et peut être tirée. Cependant, après ce premier appel de tirage au sort, je voudrais être en mesure de lire la sortie des sommets par le geometry shader.

Utilisation de la ressource mise en scène tampon que je suis en train de le faire comme ça (juste après le premier appel de tirage):

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

compile et ne donne pas d'erreur lors de l'exécution. Cependant, je ne semble pas être obtenir une sortie.

Le nuanceur géométrique délivre en sortie le texte suivant:

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

et la VERTEX_STREAMOUT est déclarée comme ceci:

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

Suis-je manque quelque chose ici?

Était-ce utile?

La solution

Problème résolu en créant la mémoire tampon de ressources de mise en scène comme ceci:

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

Le problème était avec le ByteWidth.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top