وسام البهنسي

مدونة مبرمج معماري

تقنيات الرسم في مشهد مكتب عنبر

مكتب عنبر هو واحد من أواخر مشاريع In|Framez التي عملتُ بها، وهو برنامج تجوال تفاعلي لإحدى باحات مكتب عنبر في دمشق، وهو المشروع الثاني من نوعه بعد متحف العمارة الأموية في الواقع الافتراضي.

 

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

 

كما هو الحال مع بقية مشاريع In|Framez، فقد كان محرك DSK هو الأداة المحورية في رسم المشهد. وسأتحدث فيما يلي عن تقنيات رسم المشروع من خلال طرح الإمكانيات التي استخدمناها في المحرك للوصول إلى النتيجة المرغوبة:

 

الانعكاسات والانكسارات:

باحة مكتب عنبر مليئة بالعناصر المكسوّة بمواد عاكسة، كالأرضية الرخامية الصقيلة والنعلات إضافة للنوافذ المنتشرة على كافة الجدران. وهنا نستخدم ميزتين هامتين في المحرك لمعالجة هذه المظاهر:

 

  1. الرسم على إكساء في الزمن الحقيقي وإمكانية استخدام هذا الإكساء مباشرة أثناء رسم المشهد وفي نفس اللقطة.
  2. إمكانية تطبيق تأثير غباشة على الإكساء إياه بشكل فوري وبسرعة فائقة ودون استهلاك ذاكرة إضافية (سأذكر المزيد عن هذه الميزة لاحقاً).

 

لرسم الانعكاس، يقوم المحرك بتحديد الأجسام المنعكسة في المشهد، تمهيداً لرسمها على إكساء جانبي يتم تطبيق تأثير الغباشة عليه بشكل طفيف لإعطاء الانعكاسات مسحة لطيفة من التشتت. هذا الإكساء يُستخدم أثناء رسم السطح النهائي في المشهد كمصدر للأطياف اللونية للانعكاس. يَستخدِم المحرك مظللاً لحساب اللون المنعكس عن السطح معتمداً بذلك معادلة خاصة تختلف كلياً عن المعادلات الشائعة في محركات الرسم. الصور التالية تـُظهر تأثير الانعكاس على الأرضيات والنوافذ والنعلات:

 

الأرضية والنعلات على الجدران مع الانعكاسات

الأرضية والنعلات على الجدران مع الانعكاسات

 

 

نفس اللقطة لكن مع تجاهل الانعكاسات

نفس اللقطة لكن مع تجاهل الانعكاسات

 

 

المعادلة هي الدمج الخطي بين شِقـَّين: الشق الأول هو الطيف اللوني الأصلي للمادة مضافاً إليه طيف المادة مُعادَلاً بطيف الانعكاس. أما الشق الثاني فهو طيف الانعكاس فقط، وهو ذاته مقدار الدمج. لاحظ أننا نتكلم عن أطياف لونية مستقلة، لذلك فالمعادلة تطبق عملياً على ثلاث محاور في نفس الوقت.

 

 

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

 

المسطح المائي في البحرة، حيث تجتمع حسابات الانعكاس والانكسار وامتصاص الضوء والشفافية 

المسطح المائي في البحرة، حيث تجتمع حسابات الانعكاس والانكسار وامتصاص الضوء والشفافية

 

 

البحرة إياها، دون المسطح المائي

البحرة إياها، دون المسطح المائي

 

 

الإضاءة واللمعانات:

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

 

 

حسابات الإضاءة على الحديد المشغول

حسابات الإضاءة على الحديد المشغول

 

 

معالجة الصورة والوهج:

بعد الانتهاء من رسم المجسمات في اللقطة، نأخـُذ الصورة الناتجة ونمررها على مرشح تحسين الألوان في المحرك. يقوم هذا المرشح بتحسين الألوان عن طريق زيادة تباينها وإبراز الألوان الساطعة لتطغى على الألوان القاتمة، مما يعزز الشعور بتوهج ضوء الشمس وانتشاره في السماء. كما هو معروف، يتم استخدام نسخة مصغرة ومغبشة من المشهد للحصول على تأثير السطوع، ولتوليد هذه النسخة المصغرة يلجأ مبرمج الرسوميات عادة لإنشاء سطح رسم احتياطي يستعمله أثناء تصغير الصورة ضمن سلسلة عمليات التصغير التي تنقص حجم الصورة إلى النصف في كل مرة. إلا أن محرك DSK يتيح لنا ميزة تجهيز النسخ المصغرة هذه بالزمن الحقيقي وبشكل مجاني وفوري ودون أي عناء إضافي، وذلك عن طريق استخدام إمكانية توليد طبقات Mipmap بشكل تلقائي والتي تدعمها أغلب معالجات الرسوميات اليوم (auto-gen mipmaps). هذه العملية ليست فقط أوفر في الذاكرة، بل وأسرع في التنفيذ من التصغير اليدوي باستخدام سطح مؤقت مُساعِد.

 

 

ضغط المجسمات والإكساءات:

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

 

كما هو معروف، تـُقدم معالجات الرسوميات اليوم أسلوب ضغط DXT أو S3TC كما يسميه البعض. ويحوي المحرك أدوات لضغط الإكساءات بهذه الصيغ المعروفة، إلا أنه يضيف إليها خوارزميات خاصة لتحسين جودة الإكساء بعد فك ضغطه على معالج الرسوميات (أثناء تنفيذ مظلل البكسلات). بفضل هذه الإمكانية نستطيع تحقيق نسبة ضغط 1:8 وبتضحية محدودة جداً في الجودة، خلافاً للمحركات التي تستخدم هذا الأسلوب في الضغط دون أية معالجات إضافية.

 

أما بالنسبة للمجسمات فإن شرح طريقة ضغطها يطول، لكني سأذكر أهم ما فيها، فرؤوس المثلثات التي تتشكل منها المجسمات في هذا المشهد تحمل معلومات الإحداثيات الفراغية وإحداثيات الإكساء وقيمة لونية رباعية. هذه المعلومات في الحالة التقليدية تستهلك 24 بايت للرأس الواحد، يقوم محرك DSK بضغطها لتصبح 8 بايت فقط للرأس الواحد، أي بنسبة 1:3. فك الضغط يتم في بداية كود مظلل الرؤوس، ويستهلك تقريباً 24 تعليمة. هو ليس بالزمن القليل طبعاً لكننا في المقابل قلصنا عرض حزمة المعلومات التي تنتقل بين أجزاء ذاكرة معالج الرسوميات، وهذا في حد ذاته يزيد من الأداء ويوفر الذاكرة ويزيد من سرعة التحميل.

 

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

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

 

 

أمور أخرى ومتفرقات (كشف التصادم):

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

إلا أن الاختلاف الأهم الذي يميز المحرك هنا هو أن إجراءات إنجاز اختبار التصادم فيه تتميز بسرعة أدائها ودقتها وموثوقية نتائجها، حيث يعمل إجراء كشف التقاطع المركزي في المحرك بضعف سرعة أسرع إجراء وجدتـُه، والذي كان منشوراً كورقة علمية صغيرة في أحد أعداد مجلة Journal of Graphics Tools عام 2005:

 

Amy Williams, Steve Barrus, R. Keith Morley, and Peter Shirley

An Efficient and Robust Ray-Box Intersection Algorithm
Journal of Graphics Tools, 10(1):49-54, 2005

 

 

أرجو أن تكون هذه المعلومات ذات فائدة لكل من يودّ إنجاز مشاريع رسومية من طراز مشابه، وإن كانت لديكم أية أسئلة عن هذه المعلومات فأرجو ألا تترددوا بطرحها في أروقة الشبكة العربية لمطوري الألعاب.

 

والسلام عليكم ورحمة الله وبركاته…

التعليقات (1) -

  • wbahnassi

    22/02/2010 01:27:30 م | الرد

    أتوجه بالاعتذار للقراء الأعزاء عن خطأ ارتكبته في المقالة في خضم الحديث عن ضغط المجسمات، حيث أنني كنت قد ذكرت أن حجم الرأس بعد الضغط 4 بايتات فقط، والصحيح هو أنه 8 بايتات فقط، فتصبح نسبة الضغط عند ذلك 1:3.

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

    www.agdn-online.com/communities.aspx

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

    آسف مرة أخرى، وليكونن هذا درساً قاسياً لي كي لا أكتب التدوينات أثناء العمل Smile

أضف تعليقاً

Loading