1

ストリーム出力を使用してバッファーに出力するジオメトリ シェーダーから出力を読み取ろうとしています。

ジオメトリ シェーダーで使用される出力バッファーは、次のように記述されます。

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

ジオメトリ シェーダーは、1 つのポイントに基づいて多数の三角形を作成します (ポイントごとに最大 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; 
}; 

ここで何か不足していますか?

4

1 に答える 1

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にありました。

于 2009-09-05T16:18:48.330 に答える