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ます。
私はこのような他のバッファリソースを(今回ステージングフラグを設定する)宣言しました
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