سؤال

أنا أكتب تطبيق النمذجة ثلاثية الأبعاد في D3D9 الذي أود أن أجعله متوافقا على نطاق واسع قدر الإمكان. هذا يعني استخدام عدد قليل من ميزات تعتمد على الأجهزة، أي Multisampling. ومع ذلك، في حين أن التجسيد في الوقت الحقيقي لا يحتاج إلى أن يكون لا تشوبه شائبة، إلا أنني بحاجة إلى تقديم يلتقط شاشة لطيفة المظهر، والتي بدون multisampling، تبدو مستعيدة للغاية والفقراء.

لإنتاج جلسة الشاشة، أقوم بإنشاء سطح مؤقت في الذاكرة، مما يجعل المشهد عليه مرة واحدة، ثم احفظه على ملف. فكرتي الأولى في كيف يمكنني تحقيق التقاط الفاصل هو إنشاء Stencilsurface خارج الشاشة على أنه متعدد الشاشة، ولكن بالطبع لن يسمح DX بالطبع لأن الجهاز نفسه قد تمت تهيئته باستخدام D3DMultisample_none.

للبدء، إليك عينة من الطريقة بالضبط كيف أقوم بإنشاء ScreenCapture. أعلم أنه سيكون أكثر بساطة لنقذ الفناء الخلفي للإطار الذي تم عرضه بالفعل، إلا أنني بحاجة إلى القدرة على حفظ صور البعد مختلفة عن نافذة RENDER الفعلية - وهذا هو السبب في أنني أفعل ذلك بهذه الطريقة. التحقق من الأخطاء، رمز لاستعادة الحالة، والافراج عن الموارد يتم ommitted هنا للإيجاز. m_d3ddev هو بلدي lpdirect3device9.

//Get the current pp
LPDIRECT3DSWAPCHAIN9 sc;
D3DPRESENT_PARAMETERS pp;
m_d3ddev->GetSwapChain(0, &sc);
sc->GetPresentParameters(&pp);

//Create a new surface to which we'll render
LPDIRECT3DSURFACE9 ScreenShotSurface= NULL;
LPDIRECT3DSURFACE9 newDepthStencil  = NULL;
LPDIRECT3DTEXTURE9 pRenderTexture   = NULL;
m_d3ddev->CreateDepthStencilSurface(_Width, _Height, pp.AutoDepthStencilFormat, pp.MultiSampleType, pp.MultiSampleQuality, FALSE, &newDepthStencil, NULL );
m_d3ddev->SetDepthStencilSurface( newDepthStencil );
m_d3ddev->CreateTexture(_Width, _Height, 1, D3DUSAGE_RENDERTARGET, pp.BackBufferFormat, D3DPOOL_DEFAULT, &pRenderTexture, NULL);
pRenderTexture->GetSurfaceLevel(0,&ScreenShotSurface);

//Render the scene to the new surface
m_d3ddev->SetRenderTarget(0, ScreenShotSurface);
RenderFrame();

//Save the surface to a file
D3DXSaveSurfaceToFile(_OutFile, D3DXIFF_JPG, ScreenShotSurface, NULL, NULL);

يمكنك رؤية المكالمة إلى createPthstencilSurface ()، والتي هي حيث كنت آمل أن أستبدل PP.MultisampleType مع IE D3DMULTISAMPLE_4_SAMPLES, ، ولكن هذا لم ينجح.

كان فكرتي التالية لإنشاء LPDirect 3DDEVICE مختلفا تماما ك D3DDEVTYPE_REF, ، والتي تدعم دائما D3DMULTISAMPLE_4_SAMPLES (بغض النظر عن بطاقة الفيديو). ومع ذلك، تم تحميل جميع مواردي (تنسجم، القوام) في M_D3DDEV، جهاز Hal الخاص بي، وبالتالي لم أستطع استخدامها لتقديم المشهد تحت جهاز REF. لاحظ أن الموارد يمكن تقاسمها بين الأجهزة تحت Direct3D9EX (Vista)، لكنني أعمل على XP. نظرا لأن هناك الكثير من الموارد، فإن إعادة تحميل كل شيء لتقديم هذا الإطار واحد، ثم تفريغها، فهو غير فعال لتطبيقي.

لقد بحثت في خيارات أخرى للاديا لافتتاحية الصورة بعد التقاط الصور (IE 3X3 Blur Filter)، لكنها قد ولدت جميع نتائج crappy جميلة، لذلك أود حقا أن أحاول الحصول على مشهد متحمس مباشرة من D3D إذا كان ذلك ممكنا ....

سيتم تقدير أي حكمة أو مؤشرات بشكل كبير ...

شكرا!

هل كانت مفيدة؟

المحلول

من المحتمل أن يكون مثاليا من إذ يفسر إما أن يجعل المخزن المؤقت الأكبر وتوسيع نطاق أو الجمع بين المخازن المؤقتة Jittered أفضل رهان. يجب أن تعطيك الجمع بين المخازن المؤقتة المتسرعة المتعددة أفضل جودة لعدد معين من العينات (أفضل من الشبكة العادية من تقديم عدد معادل من العينات من العينات في مضاعفة الدقة والتقليل) ولكنه يحتوي على النفقات العامة الإضافية لمرات التقديم المتعددة. تتمتع بميزة عدم محدودة من الحد الأقصى الذي يدعمه الحد الأقصى لمستهدف تجسيدك على الرغم من ذلك ويسمح لك باختيار مستوى تعسفي إلى حد كبير من AA (على الرغم من أنه سيتعين عليك مشاهدة المشكلات الدقيقة إذا دمج العديد من المخازن المؤقتة المتضخة).

توضح المقالة "الحفيفة مع تراكم العازلة" في OpenGl.org كيفية تعديل مصفوفة الإسقاط الخاصة بك لأخذ عينات مماثلة (OpenGL ولكن الرياضيات هي نفسها بشكل أساسي). ورقة "أخذ العينات المتداولة" من قبل ألكساندر كيلر ولفغانغ هايدريش تتحدث عن امتداد التقنية التي تمنحك نمط أخذ العينات أفضل على حساب يمر المزيد من التقديم. آسف على عدم توفير روابط - كمستخدم جديد يمكنني فقط نشر رابط واحد لكل إجابة. يجب أن تجد Google لهم.

إذا كنت ترغب في الذهاب إلى مسار التقديم إلى أخذ عينات مؤقتة وأخذ عينات مؤقتة ولكن لا تريد أن تكون محدودا بحجم الهدف الحد الأقصى المسموح به، فيمكنك إنشاء صورة من البلاط باستخدام مصفوفات الإسقاط خارج المركز كما هو موضح هنا.

نصائح أخرى

يمكنك دائما تقديم نسيج هو ضعف العرض والارتفاع (أي حجم 4X) ثم Supersampled.

من المسلم به أنك لا تزال تحظى بمشاكل إذا لم تتمكن البطاقة إنشاء نسيج 4X حجم العاجلة الخلفية ...

تحرير: هناك طريقة أخرى تتبادر إلى الذهن.

إذا كنت تكرر الإطار N-Times مع Junters Tiny To View Matrix، فستتمكن من إنشاء العديد من الصور التي تريدها، يمكنك إضافةها بعد ذلك بعد ذلك إلى تشكيل صورة عالية للغاية لمكافحة التعيس. المكافأة، ستعمل على أي آلة يمكن أن تجعل الصورة. من الواضح أن أبطأ. لا يزال 256xaa حقا تبدو جيدة عندما تفعل هذا!

هذه المقالة http://msdn.microsoft.com/en-us/library/bb172266(VS.85).aspx. يبدو أنه يعني أنه يمكنك استخدام Flag State Render D3DRS_MULTISAMPLEANTIALIAS للتحكم في هذا. هل يمكنك إنشاء جهازك مع تمكين القوس ولكن قم بإيقاف تشغيله لعرض الشاشة وعلى عرضه خارج الشاشة باستخدام إشارة الدولة الموجودة؟

أنا لم أحاول هذا نفسي على الرغم من ذلك.

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