代码之家  ›  专栏  ›  技术社区  ›  Tchami

读取CPU上几何体明暗器的输出

  •  1
  • Tchami  · 技术社区  · 15 年前

    我正在尝试从使用流输出输出输出到缓冲区的几何体明暗器读取输出。

    几何体明暗器使用的输出缓冲区描述如下:

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

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

    使用缓冲区临时资源,我正尝试这样做(在第一次调用draw之后):

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

    顶点流输出声明如下:

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

    我是不是错过了什么?

    1 回复  |  直到 15 年前
        1
  •  1
  •   Tchami    15 年前

    通过创建这样的临时资源缓冲区解决的问题:

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

    字节宽度有问题。