تكلّمنا في المرّة السابقة عن مفهوم الاكساء ، وكيف أنه مجرّد تلوين للأجسام ثلاثية الأبعاد ، ثم التلاعب بتلك الألوان للايحاء وجود تفاصيل زائدة .
عرفنا أيضا أن البطاقة الرسومية تقوم بتصغير وتكبير صورة الاكساء بحسب بٌعد الجسم ثلاثي الأبعاد ، فاذا كان الجسم بعيدا ، فانه يظهر بحجم صغير ، لهذا يتم تصغير اكساؤه ، أمّا اذا كان قريبا جدا ، فانه يظهر بحجم كبير ، لذا يتم تكبير اكساؤه !
اليوم نتعرف علي وجه جديد من وجوه وظيفة بطاقة الرسوميات ، وهو وجه الغباء الفطري Native Stupidity ، وتحديدا الغباء الفطري في عملية تصغير الكساءات !
تعالوا معا ننظر الي هذه الصورة :
صورة اكساء بدقة 10X10 ، ويظهر فيها ثلاثة حروف افرنجية : L و F و N .
سنحتاج الي تصغير هذه الصورة ، الي دقة 10x5 ، وسنعتبر أنها اكساء يحتاج الي التصغير :
بداية ستقوم البطاقة الرسومية بحذف نقاط من الصورة ، وهي النقاط الملونة باللون الأبيض .
تم حذف النقاط و تجميع عناصر الصورة معا .
ما الذي حدث ؟ تشوّهت الصورة تماما ، ولم يعد ظاهرا فيها سوي حرف L ، واختفت ملامح الحروف الأخري الي حد أنها لم تعد قابلة للتمييز بعد الآن.
سبب ذلك هو عدم قدرة البطاقة الرسومية علي تمييز الأجزاء المهمة من الصورة ، فهي تحذف بآلية كاملة ، دون أن تضع في اعتبارها هل عملية الحذف هذه ستؤثر علي تفاصيل الصورة أم لا ، فهي لا تفهم أصلا محتوي الصورة ، وكل ما تراه البطاقة الغبية هو بعض النقاط اللونية جميلة الشكل .
بالطبع لا يجب السماح بحدوث هذه الظاهرة ، والا تشوّهت صور الكساءات كلما ابتعدنا عنها !
صورة لكساء أرضية ، انظر الي أفق الصورة البعيد ، ستلاحظ وجود ألوان مختفية و فواصل بين الألوان ، والسبب بالطبع هو غباء البطاقة الرسوميّة !
والأسوأ من كل هذا ، ما يحدث عندما يغير اللاعب من مسافته بالنسبة الي الكساء ، فبفرض لبتعاده عن الاكساء أكثر ، فان دقة الاكساء تقل أكثر ، وبالتالي تتغير تفاصيله ، وعندما يقترب منه أكثر فان دقة الاكساء تزيد ، وبالتالي تزيد تفاصيله ، وتكرار الاقتراب والابتعاد عن الاكساء بسرعة يجعل تفاصليه تظهر وتختفي بسرعة ، ويعطي شكل الاكساء طابعا من الاهتزاز والاضطراب ، وكأن تفاصيله تومض وتُظلم بسرعة Flicker .
ابتعاد اللاعب عن الاكساء ، يقلل دقته ، فيصبح في 10x4 ، وتفاصيل الاكساء تقلّ أكثر (اختفي حرف L تماما) .
اقتراب اللاعب من الاكساء يزيد دقته ، فتصبح 10x6 ، وهنا يستعيد الاكساء جزءا من تفاصيله المفقودة (ظهور حرف L وحرف F ) .
نسخ مختلفة من صورة الاكساء ، من اليمين الي اليسار 4x10 و 5x10 و 6X10 ، العرض السريع لهذه الصور مختلفة الدقة (كما في حالة ابتعاد اللاعب واقترابه بسرعة) ، يعطي تأثير الاهتزاز والاضطراب علي الاكساء .
ظاهرة الاهتزاز الكسائية .. وهي شائعة للغاية في الألعاب .
ولا يقتصر الأمر علي ذلك فقط ، فقد تتسبب ظاهرة الحذف في ظهور تعرجات في الصورة لم تكن موجودة من قبل ، وذلك بسبب تداخل عناصر الصورة بشكل غير طبيعي .
والحل ؟ لا يوجد حل تقني للأسف .. فلا يمكن تطوير طريقة لتفهم بها البطاقة الرسومية الأجزاء المهمة من الصورة لتتجنّب حذفها ، لأن الصور تختلف وتتنوع في ألوانها وتفاصيلها بشدة ، مما يضمن استحالة وجود طريقة شاملة تصلح للتطبيق علي الجميع .
الحل سيكون هنا بالطريقة التقليدية اليدوية ، وهو أن يقوم المصمم بعمل نسخ مختلفة الدقّة من الصورة الأصلية ، فاذا كانت دقة الصورة 512x512 مثلا ، يقوم المصمم بعمل نسخة من هذه الصورة بدقة 256x256 ، ونسخة أخري بدقة 128x128 ، وأخري بدقة 64x64 ، وأخري بدقة 32x32 ، وأخري بدقة 16x16 ..الخ ويستخدام هذه النسخ بدلا من عملية التصغير ، فاذا أرادت البطاقة اكساءا صغيرا ، استخدمت نسخة 16x16 ، واذا أرادت اكساءا متوسطا ، استخدمت نسخة 64x64 .. وهكذا .
نسخ مختلفة الدقة من نفس الاكساء .. وتُسمّي هذه النسخ المصغرة باسم MIP-Maps .
هكذا تم التغلب علي غباء البطاقة الرسومية ، فتلك النسخ المُصغّرة ستحتوي علي تفاصيل الصورة الكاملة لكن بحجم أصغر ، وعندما تستخدمها البطاقة الرسومية لا يحدث فقد في التفاصيل ولا يحدث اهتزاز واضطراب للصورة .
لكن ماذا اذا احتاجت البطاقة الي حجم معيّن ، غير موجود في هذه النسخ المصغرة ؟ ، مثلا 50x50 ؟
الحل هنا يتمثّل في استخدام اقرب نسخة مصغرة (32x32)، ثم تطبيق عملية التوسيع(التكبير) Stretch عليها بحيث تصبح بدقة 50x50 .
بالطبع نعرف جميعا عيوب عملية التوسيع ، من زيادة في التعرّجات و تشوّه في الصورة بسبب استخدام الألوان الوسطيّة ، لكن تأثير هذه العيوب يكون خفيفا هنا ، لأن الدقة الجديدة (50X50) قريبة نوعا من دقّة الصورة الأصلية (32x32).
لكن حتي هذا الحل لا يصلح في جميع الحالات والظروف ، حيث يعيبه عدم قدرته علي عرض الأسطح الممتدة بشكل جيّد .
والأسطح الممتدة هي الأشكال التي تمتد في الأفق ، مثل أرضية ممر ممتد ، أو أرضية صحراء أو شارع ممتد ..الخ
أرضية ممر ، والجزء القريب من اللاعب دقته عالية (عدد نقاطه أعلي) ، والأجزاء البعيدة دقتها قليلة ، الي درجة أن تفاصيل ألوان الأرضية تكاد تختفي تماما .
عند عرض هذه الأسطح ، يأخذ الجزء القريب من اللاعب فيها أقصي دقّة للاكساء (مثلا 512x512)، لكن الجزء البعيد يأخذ دقة أقل (مثلا 128x12
، والجزء الأبعد يأخذ دقة أقل وأقل (مثلا 64x64) ،والجزء البعيد جدا يأخذ دقة قليلة للغاية (مثلا 16X16 ) .
المشكلة في الحاجة الي استخدام دقات وسطيّة علي طول امتداد هذه الأسطح ، (مثلا 70x70 ) ، وهذه تأخذ أقرب دقة متاحة لها وهي 64x64 ، وتتعرض لعملية توسيع ، مما يجعل من شكل هذه الاكساءات باهتا ومموها الي حد ما .
وتكون هناك دقات شاذة أيضا ، مثلا 150x70، وهذه تأخذ أيضا أقرب دقة متاحة لها ، وهي 64x64 ، لأن الـ64 أقرب الي الـ70 ، ماذا عن الـ150 اذن ؟ لا يمكن استعمال دقة 128x128 معها ، لأن الـ 128 أكبر من الـ70 ، وهذه العملية تتطلب توافقا كاملا بين قيمتي الدقة ، لذا فلا مفر من استخدام نسخة 64x64 مع الـ150 و سيحدث فيها تشوه أكبر بالطبع لأن المصدر دقته 64 فقط ، أي أقل من نصف الـ150.
ومما يزيد الطين بلّة هو أن نسبة حدوث الدقات الشاذة (مثل 150X70 )أكبر بكثير من الدقات الوسطيّة (مثل 70X70) ، لأن الأسطح الممتدة تكون واسعة القاعدة ، وضيقة القمة ، أي ذات شكل هرمي تقريبا .
ومحصلة كل هذا هو زيادة تشوّه الصورة كلما ايتعدنا عن الدقة الكبيرة (ابتعدنا عن اللاعب) .
الأسوأ أن هذه الاكساءات ذات الدقات المختلفة تتراص مع بعضها تباعا في حالة الأسطح الممتدة، وهنا يظهر فارق الوضوح والدقة بينها وبين بعضها ، ولا يكون المنظر جميلا أبدا .
في الصورة أرضية ممتدة مرصوفة بالحجارة ، والأرضية مجرّد صورة اكساء ، ويظهر فيها فروق الوضوح في التفاصيل كلما ازداد البعد ، حيث تتشوه الكساءات نتيجة عملية التوسيع .
يمكنك تمييز الفارق بين كل نسخة اكساء MIP-Map ، وهو الخط الفاصل بين درجات وضوح التفاصيل ، فالجزء الأسفل من الصورة (الأقرب للاعب) يظهر واضحا ، بينما الجزء الأعلي يظهر مموّها وغير واضح المعالم .
مثال آخر علي أرضية مختلفة .. ويظهر بوضوح الخطوط التي تفصل بين منطقتين اكسائيتين .
يعيب تلك الخطوط أنها تزحف باستمرار أمام اللاعب ، فعندما يتحرّك اللاعب -سواء بالابتعاد أو الاقتراب- فانه يغيّر من دقة الكساءات التي أمامه باستمرار ، وهذا التغيير المستمرّ يصاحبه انتقال لهذه الخطوط ، لأنها تفصل بين كل دقة ودقة ، لذا تظهر وكأنها تزحف أو تتحرك مع حركة اللاعب ، وتلك الحركة غير طبيعية ، وتفسد علي اللاعب متعة مشاهدة الرسوميات الفائقة .
للتغلب علي هذه الخطوط الفاصلة ، يجب عمل عملية دمج للألوان علي جانبي هذه الخطوط ، والدمج هنا يكون بعملية تكوين ألوان وسطية بين المنطقتين ، بحيث يختفي الخط الفاصل هذا تماما ، وهي عملية مماثلة لعمليّة ممانعة التعرّج Anti-Aliasing ، ويطلق عليها هنا اسم Tri-linear Filtering ، أو الترشيح الثلاثي ، لأنها تتضمّن ثلاثة عمليات لتكوين الألوان الوسطيّة ، عملية علي النقطة الملاصقة للخط الفاصل في المنطقة الأولي ، وعملية ثانية علي النقطة في المنطقة الثانية ، ثم عملية ثالثة بين نتيجتي العمليتين الأولتين ، للخروج بلون النقطة علي الخط الفاصل بين المنطقتين .
فائدة الألوان الوسطيّة هنا هي اضافة تأثير التدرّج علي الألوان بين المنطقتين ، بهدف القضاء علي تلك الخطوط الفاصلة ، والتي تنشأ كما ذكرنا بسبب اختلاف الدقة بين منطقتين اكسائيتين ،حيث تمتلك احدي المنطقتين ألوانا أقوي من الأخري ، وهذا يعطي مظهر الخطوط الفاصلة الزاحفة .
الفارق بين تفعيل الترشيح الثلاثي وعدم تفعليه يظهر واضحا هنا ، الي اليمين لاتوجد فواصل واضحة بين المناطق الاكسائية مختلفة الدقة ، أما علي اليسار فما تزال الخطوط واضحة .
مثال آخر ، الي اليمين لاتوجد فواصل واضحة بين المناطق الاكسائية مختلة الدقة ، أما علي اليسار فما تزال الخطوط واضحة .
مثال جديد ، الي اليمين لا توجد خطوط فاصلة ، لكن علي اليسار توجد ..
لكن القضاء علي مشكلة الخطوط الفاصلة هو أقل مشاكلنا ، فلا يزال أمر اختفاء وضوح التفاصيل مع بعد المسافة قائما ، وهو لعمري أدهي وأمرّ .
ولقد وضحنا سبب هذه الظاهرة بالفعل ، فكلما زادت المسافة ، استعملت البطاقة الرسومية اكساءا ذي دقة قليلة (16x16 مثلا) ،ثم قامت بتوسيعه الي دقّة شاذة مثل 50x25 باستخدام الألوان الوسطيّة (مع ما صاحب هذا من تشوهات في الصورة ) ومع تشغيل اللعبة علي دقة شاشة كبيرة ، (مثلا 1920x1080 ) ، نجد أن الاكساء يتشوّه أكثر نتيجة تطبيق عملية التوسيع للمرة الثانية عليه ، ويتغيّر منظره تماما .
اكساء أصلي بدقة 20x20 ، والي جواره نسخة مصغّرة منه بدقة 10x10 .
نريد الآن تشغيل هذا الاكساء بدقة 20x10 ، وهذه هي دقة شاذة .
تكبير الاكساء المصغّر من دقة 10x10 الي دقة 20x10 (دقة شاذة)، لاحظ الألوان الوسطية القبيحة التي نشأت .
تكبير الصورة يعني أن تضيف البطاقة الرسوميّة نقاطا زائدة عليها ، وهنا تتم اضافة نقطة واحدة بين كل نقطتين ، واذا كان لون النقطتين غير متماثلا ، فان النقطة الزائدة بينهما تأخذ لونا وسطيا بين لونيهما ، وفي هذا المثال نجد أن اللون الوسطي بين اللون الأخضر والأصفر ، هو الأخضر الباهت .. ومن هنا ينشأ التشويه (راجع الجزء الأول ).
لحلّ هذه العقبة الأخيرة ، ابتكر المطورون مرشّحا جديدا ، سمّوه المُرشّح غير الاعتيادي Anisotropic Filtering ، ومُهمّة هذا المرشح غير تقليدية وشاقة بالفعل .
ففي مثالنا الأخير ، نحتاج لتكبير صورة من دقة 10x10 الي دقة 20x10 ، أي ينقصنا 10 نقاط في البعد العرضي .
في طريقة التكبير التقليدية ، تمّ تعويض هذه النقاط بألوان وسطيّة ، لكن هذا المرشّح غير تقليدي ، فهو يقوم بتحليل الكساء الصغير ذو دقة 10x10 ، وتحليل الكساء الكبير ذو دقة 20x20 ، وتحليل الألوان الوسطيّة بينهما للوصول لأفضل الحلول اللونية الممكنة لتعويض النقاط الناقصة .
بل يتمادي المرشّح في عمله الي درجة فحص 128 نقطة لونية من أجل تعويض نقطة واحدة فقط .
والنتيجة هي دقة غير عادية في تكبير الصور ، دون وجود فقد في التفاصيل ، مع تقليل التشوّهات الي الحد الأدني.
الي اليمين ، باستخدام المرشّح غير التقليدي . الي اليسار ، التكبير بالطريقة التقليدية .
مثال عملي : الي اليمين اللعبة باستخدام المرشح غير التقليدي ، الي اليسار بدون استخدامه ، لاحظ كيف تمتد الأرضية أمام اللاعب بكامل تفاصيلها (اليمين) .
مثال آخر : الي اليمين ، المرشّح غير التقليدي ، الي اليسار ، بدونه .
بالطبع فارق السماء والأرض ، وتظهر الاكساءات و كأنها جديدة !
وعلي وجه العموم فان مرشحات الاكساءات تستهلك طاقة حسابية كبيرة من البطاقة الرسومية ، بل وتخفض من قدرة البطاقة الاكسائية الي النصف في الكثير من الأحيان ، لكن فارق الصورة يستحقّ كما رأينا .
الشئ الجيد ، هو أن البطاقات الرسومية الحديثة ، تستطيع معالجة هذه المرشّحات بكفاءة عالية ، دون فقد كبير في الأداء ، لذا فانه من المفضل تفعيل هذه المرشّحات في كل الألعاب ، وبالذات المرشّح غير التقليدي Anisotropic Filtering .
تفعيل هذا الأخير ، يكون علي مستويات ، أوّل مستوي وهو 1X ، يقوم بتحليل ثمانية نقاط لونية من أجل تعويض نقطة واحدة ، ثاني مستوي 2X ، يقوم بتحليل 16 نقطة .. 4X يقوم بتحليل 32 نقطة ، 8X يقوم بتحليل 64 ، و 16X ، يقوم بتحليل 128 نقطة ، وكلما زاد المستوي ، زادت كفاءة المرشّح في تكوين الاكساء .
يمكن تفعيل هذا المرشّح بشكل اجباري في كل الألعاب من لوحة التحكم ببرنامج القيادة (التعريف Driver )، ومن المُستحسن وضعه علي المستوي الثامن 8X ، أو المستوي الأقصي 16X ، للحصول علي أفضل النتائج البصريّة .
في النهاية رأينا كيف تطورت الاكساءات من مجرد وسيلة خادعة لتوفير عدد المضلّعات ، الي أداة معقدة ذات مزايا جمّة ، لكن مع عيوب تحتاج الي اصلاح ، ولحسن الحظ ، فان مزايا الاكساءات تفوق عيوبها أضعافا ، فيكمن للاكساء الواحد توفير 50% من عدد المضلّعات اذا تم استخدامه بشكل جيّد .
في المرة القادمة باذن الله ، سنتعرف علي وجه جديد للخداع من أوجه الاكساءات ، وهي الاكساءات الشفّافّة !
سؤال الحلقة :
1-بعد أن عرفت فائدة المرشّح الغير تقليدي ، هل ستقوم بتفعليه في كل الألعاب وعلي نحو دائم ؟
2-هل أصابك كل هذا الحديث عن الاكساءات بالملل ؟ ما مقدار استيعابك للمقال ؟ 50% ، 60% ، 80% أم 100% ؟
المفضلات