2009-09-04 9 views
1

J'essaie de lire la sortie d'un shader de géométrie qui utilise stream-output pour sortir dans un buffer.Lecture de la sortie de geometry shader sur la CPU

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 nuanceur géométrique crée un certain nombre de triangles en fonction d'un point unique (au maximum 12 triangles par point), et si je comprends le SDK correctement je dois créer une ressource de transit afin de lire la sortie du geometry shader sur le 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 de tirage de l'application geometry shader est fait créer tous les triangles et peut être dessiné. Cependant, après ce premier appel, j'aimerais pouvoir lire les sommets produits par le shader de géométrie.

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

Cette compile et ne donne pas d'erreur lors de l'exécution. Cependant, je ne semble pas avoir de sortie.

Les sorties de shaders de géométrie qui suit:

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?

Répondre

1

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

problème était avec le ByteWidth.

Questions connexes