قراءة الإخراج من تظليل الهندسة على وحدة المعالجة المركزية
-
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 ) );
يخلق 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.