我正在尝试从使用流输出输出到缓冲区的几何着色器中读取输出。
几何着色器使用的输出缓冲区描述如下:
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;
};
我在这里错过了什么吗?