هل يحدث اختبار استنسل OpenGL قبل أو بعد تشغيل برنامج الشظية؟

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

سؤال

عندما ضبطت glStencilFunc( GL_NEVER, . . . ) تعطيل كل الرسم بشكل فعال ، ثم قم بتشغيل برنامجي [المظلل] ، لا أحصل على أي زيادة في الأداء على ترك شظايا تظليل الشظية. اعتقدت أن اختبار الاستنسل حدث قبل برنامج الشظية. أليس هذا هو الحال ، أو على الأقل غير مضمون؟ يؤدي استبدال تظليل الشظية بواحد يكتب ببساطة إلى gl_fragcolor إلى ارتفاع FPS.

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

المحلول

ألقِ نظرة على الخطوط العريضة التالية لخط أنابيب DX10 ، وتقول أن اختبار الاستنسل يعمل قبل ظلال البكسل:

http://3.bp.blogspot.com/_2yu3pmphkn4/sz_0vqlzrbi/aaaaaaaaacg/cpdxxob-r3u/s1600-h/d3d10cheatsheet.jpg

وينطبق الشيء نفسه في DX11:

http://4.bp.blogspot.com/_2yu3pmphkn4/s1khdspmoti/aaaaaaaaacw/d38b4oa_dxm/s1600-h/dx11.jpg

لا أعرف ما إذا كان هذا مُفوضًا في مواصفات OpenGL ، لكن سيكون من الضار للتنفيذ عدم إجراء اختبار الاستنسل قبل تشغيل برنامج الجزء.

نصائح أخرى

انها في الواقع قليلا من كليهما. يجب أن تحدث عمليات الشظية بعد برنامج الشظية كما ترون في هذا مخطط خط أنابيب OpenGL ES 2.0. ومع ذلك ، فإن العديد من بطاقات الرسوم البيانية الحديثة لديها اختبار Z مبكر يتجاهل الشظايا في وقت سابق طالما أنك لا تكتب إلى العمق في تظليل الشظية.

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

بالإضافة إلى تعديل عمق الشظايا ، هناك بعض الأشياء الأخرى التي يمكن أن تمنع اختبار العمق/الاستنسل من حدوثها قبل تظليل الشظية. إذا تم تمكين Z-Writes ، فإن أي طريقة لإحباط الشظية في التظليل ستفعل ذلك ، مثل اختبار ألفا أو discard تعليمات التظليل.

إذا أراد وحدة معالجة الرسومات GPU إجراء اختبار الاستنسل/Z في نفس العملية مثل كتابة z/stencil ، فيجب أن تنتظر حتى يتم تنفيذ تظليل الشظية بحيث يعرف أن الشظية مسموح بها بالكتابة إلى z-buffer. قد يختلف هذا بين البطاقات المختلفة. على الأقل يجب أن يكون من السهل معرفة ما إذا كانت مشكلتك الحالية.

كما ترون هنا:http://www.opengl.org/wiki/stencil_testيتم تشغيل اختبار الاستنسل بعد FragmentShader. أنا أفهم أنه ليس جيدًا للأداء.

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