قراءة الإخراج من تظليل الهندسة على وحدة المعالجة المركزية

StackOverflow https://stackoverflow.com/questions/1381969

سؤال

أحاول قراءة الإخراج من تظليل الهندسة الذي يستخدم الإخراج الإخراج للإخراج إلى المخزن المؤقت.

يوصف المخزن المؤقت للإخراج المستخدم من قبل التظليل الهندسي على هذا النحو:

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

يخلق Geometry Shader عددًا من المثلثات استنادًا إلى نقطة واحدة (عند Max 12 Triangles لكل نقطة) ، وإذا فهمت SDK بشكل صحيح ، يجب أن أقوم بإنشاء مورد التدريج من أجل قراءة الإخراج من تظليل الهندسة على وحدة المعالجة المركزية.

لقد أعلنت مورد مخزن مؤقت آخر (هذه المرة ضبط علامة التدريج) مثل هذا:

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

بعد أول استدعاء السحب للتطبيق ، يتم تنفيذ Shader الهندسة لإنشاء جميع المثلثات ويمكن رسمها. ومع ذلك ، بعد هذه المكالمة الأولى ، أود أن أتمكن من قراءة إخراج القمم بواسطة Shader Geometry.

باستخدام مورد التدريج المخزن المؤقت ، أحاول القيام بذلك على هذا النحو (مباشرة بعد مكالمة السحب الأولى):

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

كانت المشكلة مع BYTEWECHERTH.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top