2009-09-04 4 views
1

스트림 출력을 사용하여 버퍼로 출력하는 지오메트리 셰이더의 출력을 읽으려고합니다.CPU의 지오메트리 셰이더에서 출력 읽기

지오메트리 쉐이더에 의해 사용되는 출력 버퍼는 다음과 같이 설명된다 :

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

지오메트리 쉐이더는 모든 삼각형을 만들어 수행하고 그릴 수 있습니다 응용 프로그램의 첫 번째 무승부 호출 후 :

이 같은 다른 버퍼 자원 (준비 플래그 설정이 시간)을 선언했다. 그러나이 첫 번째 그리기 호출 후에는 형상 쉐이더에서 정점 출력을 읽을 수 있기를 바랍니다.

I (오른쪽 첫 번째 무승부 호출 후) 이런 식으로 그것을 할 노력하고있어 버퍼 준비 리소스를 사용 :이 컴파일 및 실행시 오류를 제공하지 않습니다

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

내가 여기서 뭔가를 놓치고 있습니까? 이런 준비 리소스 버퍼를 생성함으로써 해결

답변

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로했다.