سؤال

كنت أتساءل إذا كنت تجعل المشهد باستخدام تظليل التي تمر في الملمس الذي يحدث أيضا أن يكون تجعل هدف هذا المشهد أنه لن يسبب أي سلوك غير مرغوب فيه?

وذلك أساسا:

texture t;

shader->SetTexture("texture",t);

device->SetRenderTarget( 0, t->surface );

shader->Begin("effect")
// do some more shader stuff

device->EndScene();

هذا ما سوف يسبب بالضبط ؟

إذا لم تجعل الهدف قبل التقديم سوف الملمس لا تزال تعمل ؟ أفترض التغييرات النهائية لا تحصل مكتوب في الملمس حتى الجهاز->نهاية يسمى ؟

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

المحلول

أفترض أنك تتحدث عن DirectX9.الوثائق لا يقول أي شيء حول هذه القضية تحديدا ، ولكن أستطيع أن أقول لكم ما يلي:

أفترض التغييرات النهائية لا تحصل مكتوب في الملمس حتى الجهاز->نهاية يسمى

هذا هو افتراض خاطئ.تفكر في ذلك ، أنت تفترض كل بكسل من جميع مثلثات رسم سيتم تخزينها في مكان ما' و كل نسيج جلب تنفيذه دون أي بكسل كتب إلى تقديم الهدف.وهذا يتطلب التعسفي مقدار الذاكرة و بالتالي ليس من الممكن.

في الممارسة:

  • الأجهزة عادة عمليات مثلثات كما أنها تأتي العديد من دفعة واحدة
  • فإنه يقوم بتحديث الإطار العازل (الذي في حالتك هو نسيج الذاكرة النسخ) عندما يريد افتراض لا يمكن أن يكون هناك شروط السباق

حتى على افتراض DX9 لا يشكو (تحاول ذلك إذا كنت تريد حقا أن تعرف أنا لا DX9 بعد الآن) ، سوف يكون غير معروف.

وقال DirectX10 يجري أكثر وضوحا حول هذا الموضوع (المصدر):

إذا كان أي subresources حاليا أيضا ملزمة القراءة أو الكتابة (ربما في جزء مختلف من خط الأنابيب) ، تلك ربط النقاط سوف تكون فارغة رائد الخروج لمنع نفسه من subresource يتم قراءة وكتابة في نفس الوقت في واحد مما يجعل عملية.

حتى في DirectX10 ، نسيج الإعداد سيتم إزالتها عن طريق API.

نصائح أخرى

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

ووقت تشغيل التصحيح سوف تمنعك القيام بذلك، وتوفير إنذار. إطلاق سراح وقت التشغيل "القوة" (ولكن ربما لن) العمل.

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

وكما قال من قبل الآخرين ... هذا كثير جدا سلوك غير معرف.

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