从CPU上的几何着色器读取输出

时间:2009-09-04 23:41:57

标签: directx 3d hlsl directx-10 geometry-shader

我正在尝试从几何着色器读取输出,该输出使用流输出输出到缓冲区。

几何着色器使用的输出缓冲区如下所示:

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

几何着色器基于单个点创建多个三角形(每个点最多12个三角形),如果我正确理解SDK,我必须创建一个分段资源,以便从几何着色器读取输出CPU。

我已经声明了另一个缓冲区资源(这次设置STAGING标志),如下所示:

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

在应用程序的第一次绘制调用之后,几何着色器完成创建所有三角形并可以绘制。但是,在第一次绘制调用之后,我希望能够读取几何着色器输出的顶点。

使用缓冲分段资源我试图这样做(在第一次绘制调用之后):

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

这会编译并在运行时不会出现任何错误。但是,我似乎没有得到任何输出。

几何着色器输出以下内容:

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

并且VERTEX_STREAMOUT声明如下:

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

我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:1)

通过创建这样的登台资源缓冲区解决了问题:

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

问题在于ByteWidth。