Pregunta

Estoy intentando leer la salida de un shader de geometría que está utilizando la corriente de salida para dar salida a un búfer.

El búfer de salida utilizado por el shader de geometría se describe así:

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

El shader de geometría crea un número de triángulos basado en un único punto (en el máximo 12 de triángulos por punto), y si entender el SDK correctamente Tengo que crear un recurso puesta en escena con el fin de leer la salida del shader de geometría en la CPU.

He declarado otro recurso memoria intermedia (este ajuste, el indicador ESTADIFICACIÓN tiempo) como esto:

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

Después de la primera llamada sorteo de la aplicación del shader de la geometría se realiza la creación de todos los triángulos y se puede extraer. Sin embargo, después de esta primera llamada sorteo me gustaría ser capaz de leer la salida vértices por el shader de geometría.

El uso del recurso tampón de ensayo que estoy tratando de hacerlo de esta manera (justo después de la primera llamada empate):

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

Esto compila y no da ningún error en tiempo de ejecución. Sin embargo, no parece que esté recibiendo ninguna salida.

El shader de geometría da salida a la siguiente:

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

y el VERTEX_STREAMOUT se declara así:

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

Me estoy perdiendo algo aquí?

¿Fue útil?

Solución

Problema resuelto mediante la creación de la memoria intermedia de recursos puesta en escena de esta manera:

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

problema fue con el ByteWidth.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top