Post Page Advertisement [Top]


كلامك صحيح, تعتبر برمجة الإنعكاسات Reflection والتي تميز المرايا (أو أي سطح عاكس آخر كالماء مثلا) من أصعب الأمور في برمجة الرسوميات ثلاثية الأبعاد في الزمن الحقيقي (كالألعاب مثلاً) و أكثرها كلفة (تحتاج إلى معالجة طويلة لا تستطيعها أغلب معالجات كروت الشاشة الموجودة حتى وقت قريب) مما يجعلها غير مناسبة للرسوميات في الزمن الحقيقي Real Time Graphics, و ذلك بسبب الحاجة إلى معالجة الأضوية غير المباشرة Indirect Lighting والتي تعطي هذه الأسطح ميزة الانعكاس.

في نمط التصيير Rendering الأكثر شيوعاً في الألعاب حالياً, و هو Rasterization, يتم حساب اللون النهائي لكل بكسل ضمن إطار Frame معين عن طريق جلب ال Texture الخاص به (بعد تحديد المضلع polygon و النموذج 3d model التابع له) ثم حساب الإضاءة المباشرة Direct Lighting الموجودة في المشهد عن طريق حساب إن كان هناك شعاع مباشر من الأضوية الموجودة والتي تصل إلى هذا المضلع دون وجود عوائق بينها و تراكم تأثير هذه الأشعة بالإضافة إلى أخذ لون هذه الأشعة في الحسبان.

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

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

للحصول على انعكاس حقيقي و بغض النظر عن تعقيد المشهد، فأنت بحاجة إلى Global illumination, أي حساب الإضاءة في المشهد ليس فقط من الإضاءة المحلية و المباشرة, و إنما من جميع مصادر الضوء المختلفة, بما فيها الإضاءة المنعكسة عن الأغراض الأخرى.
أحد تقنيات تحقيق ذلك هو تتبع الأشعة Ray Tracing, و فكرته تختلف عن Rasterization في أنه عوضاً عن الذهاب إلى الغرض ثم معرفة الأضواء المباشرة التي تصطدم به, يتم هنا إرسالة شعاع عكسي من مكان البكسل المفترض ضمن الإطار, ثم تتبع مساره و رؤية ماهي الأغراض التي يصطدم بها, ثم نقوم بمتابعة مسار هذا الشعاع و رؤية هل يصطدم بأضوية أو أغراض أخرى, و تتم متابعة هذا الشعاع عدة مرات بعد كل انعكاس على حسب دقة الانعكاس المرغوب بها, و في كل مرة يتم حساب الضوء الناتج بشكل تراكمي.

في الأجيال الأخيرة من معالجات الرسوميات من Nvidia و AMD تم أخيراً دعم Ray tracing, حيث وصلت قوة هذه المعالجات إلى مرحلة أصبح بإمكانها إجراء هذه العمليات المعقدة ضمن قيود الزمن الحقيقي (و مع ذلك ما زالت في بدايتها, و مازال أداؤها ضعيفاً نسبياً و لا يمكن تطبيقه في دقة شاشة عالية و تفاصيل ultra مثلاً دون التضحية بجزء كبير من الإطارات في الثانية Frames per second).

انظر إلى هذه الصورة, فهي توضح لعبة Fortnite مع (و بدون) ميزة Ray tracing

ليست هناك تعليقات:

إرسال تعليق

Bottom Ad [Post Page]

|تعريب بواسطة نور للمعلوماتية