从CPU几何着色器读取输出
-
21-09-2019 - |
题
我试图读取其使用流输出到输出到一个缓冲器从几何着色器的输出。
通过几何着色器中使用的输出缓冲器被这样描述:
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;
};
我失去了一些东西在这里?
解决方案
问题解决了通过创建这样的分段资源缓冲液:
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。
不隶属于 StackOverflow