التقنيات الرسومية: تنقية الخامات/الاكساءات

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

 

تكلّمنا في المرّة السابقة عن مفهوم الاكساء، وكيف أنه مجرّد تلوين للأجسام ثلاثية الأبعاد، ثم التلاعب بتلك الألوان للايحاء وجود تفاصيل زائدة، عرفنا أيضا أن البطاقة الرسومية تقوم بتصغير وتكبير صورة الاكساء بحسب بٌعد الجسم ثلاثي الأبعاد، فاذا كان الجسم بعيدا، فانه يظهر بحجم صغير، لهذا يتم تصغير اكساؤه، أمّا اذا كان قريبا جدا، فانه يظهر بحجم كبير، لذا يتم تكبير اكساؤه!

اليوم نتعرف علي وجه جديد من وجوه وظيفة بطاقة الرسوميات، وهو وجه الغباء الفطري Native Stupidity، وتحديدا الغباء الفطري في عملية تصغير الكساءات!

تعالوا معا ننظر الي هذه الصورة :


صورة اكساء بدقة 10X10 ، ويظهر فيها ثلاثة حروف انجليزية: L و F و N.

سنحتاج الي تصغير هذه الصورة، الي دقة 10×5، وسنعتبر أنها اكساء يحتاج الي التصغير :

بداية ستقوم البطاقة الرسومية بحذف نقاط من الصورة، وهي النقاط الملونة باللون الأبيض .

تم حذف النقاط و تجميع عناصر الصورة معا.

ما الذي حدث ؟ تشوّهت الصورة تماما، ولم يعد ظاهرا فيها سوي حرف L، واختفت ملامح الحروف الأخري الي حد أنها لم تعد قابلة للتمييز بعد الآن.

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

بالطبع لا يجب السماح بحدوث هذه الظاهرة، والا تشوّهت صور الكساءات كلما ابتعدنا عنها!

Texture Filtering artifacts
صورة لكساء أرضية، انظر الي أفق الصورة البعيد، ستلاحظ وجود ألوان مختفية و فواصل بين الألوان، والسبب بالطبع هو غباء البطاقة الرسوميّة!

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


ابتعاد اللاعب أكثر عن الاكساء، يقلل دقته، فيصبح في 10×4، وتفاصيل الاكساء تقلّ أكثر (اختفي حرف L تماما).

اقتراب اللاعب من الاكساء يزيد دقته، فتصبح 10×6، وهنا يستعيد الاكساء جزءا من تفاصيله المفقودة (ظهور حرف L وحرف F).

    

نسخ مختلفة من صورة الاكساء، من اليمين الي اليسار 4×10 و 5×10 و 6X10، العرض السريع لهذه الصور مختلفة الدقة (كما في حالة ابتعاد اللاعب واقترابه بسرعة)، يعطي تأثير الاهتزاز والاضطراب علي الاكساء.

ظاهرة الاهتزاز الكسائية Texture Flicker .. وهي شائعة للغاية في الألعاب.

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

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

الحل سيكون هنا بالطريقة التقليدية اليدوية، وهو أن يقوم المصمم بعمل نسخ مختلفة الدقّة من صورة الكساء الأصلية، فاذا كانت دقة الكساء 512×512 مثلا، يقوم المصمم بعمل نسخة من هذه الصورة بدقة 256×256، ونسخة أخري بدقة 128×128، وأخري بدقة 64×64، وأخري بدقة 32×32، وأخري بدقة 16×16 ..الخ ويستخدام هذه النسخ بدلا من عملية التصغير، فاذا أرادت البطاقة اكساءا صغيرا، استخدمت نسخة 16×16، واذا أرادت اكساءا متوسطا، استخدمت نسخة 64×64 .. وهكذا.

نسخ مختلفة الدقة من نفس الاكساء .. وتُسمّي هذه النسخ المصغرة باسم MIP-Maps.

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

لكن ماذا اذا احتاجت البطاقة الي حجم معيّن، غير موجود في هذه النسخ المصغرة ؟ مثلا 50×50 ؟

الحل هنا يتمثّل في استخدام اقرب نسخة مصغرة (32×32)، ثم تطبيق عملية التوسيع/(التكبير) Stretch عليها بحيث تصبح بدقة 50×50.

بالطبع نعرف جميعا عيوب عملية التوسيع، من زيادة في التعرّجات و تشوّه في الصورة بسبب استخدام الألوان الوسطيّة، لكن تأثير هذه العيوب يكون خفيفا هنا، لأن الدقة الجديدة (50X50) قريبة نوعا من دقّة الصورة الأصلية (32×32).

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

أرضية ممر، والجزء القريب من اللاعب دقته عالية (عدد نقاطه أعلي)، والأجزاء البعيدة دقتها قليلة، الي درجة أن تفاصيل ألوان الأرضية تكاد تختفي تماما.

عند عرض هذه الأسطح، يأخذ الجزء القريب من اللاعب فيها أقصي دقّة للاكساء (مثلا 512×512)، لكن الجزء البعيد يأخذ دقة أقل (مثلا 128×128)، والجزء الأبعد يأخذ دقة أقل وأقل (مثلا 64×64)، والجزء البعيد جدا يأخذ دقة قليلة للغاية (مثلا 16X16).

المشكلة في الحاجة الي استخدام دقات وسطيّة علي طول امتداد هذه الأسطح، (مثلا 70×70 ) ، وهذه تأخذ أقرب دقة متاحة لها وهي 64×64، وتتعرض لعملية توسيع، مما يجعل من شكل هذه الاكساءات باهتا ومموها الي حد ما .

وتكون هناك دقات شاذة أيضا، مثلا 150×70، وهذه تأخذ أيضا أقرب دقة متاحة لها أيضا، وهي 64×64 ، لأن الـ64 أقرب الي الـ70، ماذا عن الـ150 اذن؟ لا يمكن استعمال دقة 128×128 معها ، لأن الـ 128 أكبر من الـ70، وهذه العملية تتطلب توافقا نسبيا بين قيمتي الدقة حتي لا نضطر الي الحذف الأعمي من الدقة الأعلي (الـ 128 في مثالنا) مع كل مشاكلة التي تحدثنا عنها في البداية، لذا فلا مفر من استخدام نسخة 64×64 مع الـ150 و سيحدث فيها تشوه أكبر بالطبع لأن المصدر دقته 64 فقط ، أي أقل من نصف الـ150.

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



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

  

   

يمكنك تمييز الفارق بين كل نسخة اكساء MIP-Map، وهو الخط الفاصل بين درجات وضوح التفاصيل، فالجزء الأسفل من الصورة (الأقرب للاعب) يظهر واضحا، بينما الجزء الأعلي يظهر مموّها وغير واضح المعالم .

 

مثال آخر علي أرضية مختلفة .. ويظهر بوضوح الخطوط التي تفصل بين منطقتين اكسائيتين.

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

للتغلب علي هذه الخطوط الفاصلة، يجب عمل عملية دمج للألوان علي جانبي هذه الخطوط، والدمج هنا يكون بعملية تكوين ألوان وسطية بين المنطقتين، بحيث يختفي الخط الفاصل هذا تماما، وهي عملية مماثلة لعمليّة ممانعة التعرّج Anti-Aliasing، ويطلق عليها هنا اسم Tri-Linear Filtering، أو الترشيح الثلاثي، لأنها تتضمّن ثلاثة عمليات لتكوين الألوان الوسطيّة، عملية علي النقطة الملاصقة للخط الفاصل في المنطقة الأولي، وعملية ثانية علي النقطة في المنطقة الثانية، ثم عملية ثالثة بين نتيجتي العمليتين الأولتين ، للخروج بلون النقطة علي الخط الفاصل بين المنطقتين.

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

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

  

مثال آخر، الي اليمين لاتوجد فواصل واضحة بين المناطق الاكسائية مختلة الدقة، أما علي اليسار فما تزال الخطوط واضحة.

 Texture Filtering 

مثال جديد، الي اليمين لا توجد خطوط فاصلة، لكن علي اليسار توجد ..

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

ولقد وضحنا سبب هذه الظاهرة بالفعل، فكلما زادت المسافة، استعملت البطاقة الرسومية اكساءا ذي دقة قليلة (16×16 مثلا)، ثم قامت بتوسيعه الي دقّة شاذة مثل 50×25 باستخدام الألوان الوسطيّة (مع ما صاحب هذا من تشوهات في الصورة) ومع تشغيل اللعبة علي دقة شاشة كبيرة ، (مثلا 1920×1080)، نجد أن الاكساء يتشوّه أكثر نتيجة تطبيق عملية التوسيع للمرة الثانية عليه، ويتغيّر منظره تماما.

 

اكساء أصلي بدقة 20×20، والي جواره نسخة مصغّرة منه بدقة 10×10.

نريد الآن تشغيل هذا الاكساء بدقة 20×10، وهذه هي دقة شاذة.

 

تكبير الاكساء المصغّر من دقة 10×10 الي دقة 20×10 (دقة شاذة)، لاحظ الألوان الوسطية القبيحة التي نشأت.

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

لحلّ هذه العقبة الأخيرة ، ابتكر المطورون مرشّحا جديدا ، سمّوه المُرشّح غير الاعتيادي Anisotropic Filtering، ومُهمّة هذا المرشح غير تقليدية وشاقة بالفعل .

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

والنتيجة هي دقة غير عادية في تكبير الصور، دون وجود فقد في التفاصيل، مع تقليل التشوّهات الي الحد الأدني.

  

الي اليمين ، باستخدام المرشّح غير التقليدي . الي اليسار، التكبير بالطريقة التقليدية.

Anisotropic Filtering

مثال عملي : الي اليمين اللعبة باستخدام المرشح غير التقليدي، الي اليسار بدون استخدامه، لاحظ كيف تمتد الأرضية أمام اللاعب بكامل تفاصيلها (اليمين).

Anisotropic Filtering 

مثال آخر : الي اليمين، المرشّح غير التقليدي، الي اليسار، بدونه.

بالطبع فارق السماء والأرض، وتظهر الاكساءات و كأنها جديدة!

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

تفعيل هذا الأخير يكون علي مستويات، أوّل مستوي وهو 1X، يقوم بتحليل ثمانية نقاط لونية من أجل تعويض نقطة واحدة، ثاني مستوي 2X، يقوم بتحليل 16 نقطة .. 4X يقوم بتحليل 32 نقطة، 8X يقوم بتحليل 64، و 16X يقوم بتحليل 128 نقطة، وكلما زاد المستوي، زادت كفاءة المرشّح في تكوين الاكساء.

يمكن تفعيل هذا المرشّح بشكل اجباري في كل الألعاب من لوحة التحكم ببرنامج القيادة (التعريف Driver)، ومن المُستحسن وضعه علي المستوي الثامن 8X، أو المستوي الأقصي 16X، للحصول علي أفضل النتائج البصريّة، يمكن تفعيله من داخل اللعبة أيضا، ويظهر في خيارات مثل Texture Filtering أو Anisotropic Filtering.

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

اشترك فى النشرة البريدية لتحصل على اهم الاخبار بمجرد نشرها

تابعنا على مواقع التواصل الاجتماعى

السابق جوال بلاكبيري Key 2 الجديد بلوحة مفاتيح Qwerty
التالى تقرير: مساعد جوجل الذكي هو المساعد الأكثر فعالية ودقة