مقدمة
يمكننا رسم خط بين أي نقطتين مثل A و B من خلال إيجاد إحداثيات X وY للنقطتين A وB.
وفي الرسومات ثلاثية الأبعاد، لا تحتوي النقاط على إحداثيات ثنائية فقط، بل ثلاثة إحداثيات هي X وY و Z.
كما نعلم أنه ليس لدينا إحداثيات ثلاثية الأبعاد على شاشة كمبيوتر ثنائية الأبعاد، لذا فإن خوارزميات الرسومات مسؤولة عن
" تسطيح " إحداثيات ثلاثية الأبعاد على مستوى ثنائي الأبعاد.
تُعرف هذه العملية باسم "3D Projection". بمجرد تحويل جميع النقاط من ثلاثي الأبعاد إلى ثنائي الأبعاد، يمكننا استخدام وظيفة رسم خط ثنائي الأبعاد عادي لربط النقاط ... حرفياً.
وهذا ما يسمى Wireframe Rendering.
تخيل بناء مكعب من عيدان تناول الطعام، وإضاءة مصباح يدوي عليه. فإن الظل الذي يلقيه على الحائط الخاص بك. إذا قمت بتدوير المكعب حوله، يمكنك أن ترى أنه كائن ثلاثي الأبعاد، على الرغم من أنه إسقاط مسطح.
هذا التحول من ثلاثي الأبعاد إلى ثنائي الأبعاد هو بالضبط ما يفعله جهاز الكمبيوتر الخاص بك، فقط مع الكثير من الرياضيات ... والقليل من عيدان تناول الطعام. هناك عدة أنواع من الإسقاط ثلاثي الأبعاد.
على سبيل المثال ما تراه الآن هو إسقاط متعامد، حيث تظهر، الجوانب المتوازية في المكعب على أنها متوازية في الإسقاط.
في العالم الحقيقي ثلاثي الأبعاد، تتقارب الخطوط المتوازية كلما ابتعدت عن العارض، مثل طريق يتجه نحو الأفق. يسمى هذا النوع من الإسقاط ثلاثي الأبعاد ب called Perspective Projection"".
إنها نفس العملية، فقط باستخدام رياضيات مختلفة. في بعض الأحيان تريد وجهة نظر وأحيانًا لا تريد ذلك فالاختيار متروك للمطور.
يمكن بسهولة تحديد الأشكال البسيطة، مثل المكعبات، بخطوط مستقيمة. ولكن بالنسبة للأشكال الأكثر تعقيدًا، تكون المثلثات أفضل وهذا ما يسمى بالمضلعات " polygons " في الرسومات ثلاثية الأبعاد.
انظر إلى إبريق الشاي الجميل المصنوع من المضلعات. مجموعة من المضلعات مثل هذه عبارة عن "شبكة".
كلما كانت الشبكة أكثر كثافة، كانت المنحنيات أكثر سلاسة والتفاصيل الدقيقة. لكن هذا يزيد أيضًا من عدد المضلعات، مما يعني المزيد من العمل للكمبيوتر.
يتعين على مصممي الألعاب أن يوازنوا بعناية بين دقة النموذج مقابل عدد المضلعات، لأنه إذا زاد العدد أكثر من اللازم، فإن معدل الإطارات للرسوم المتحركة ينخفض إلى أقل مما يعتبره المستخدمون سلسًا. لهذا السبب، توجد خوارزميات لتبسيط الشبكات.
السبب في استخدام المثلثات، وليس المربعات، أو المضلعات، أو أي شكل آخر أكثر تعقيدًا هو ببساطة: ثلاث نقاط في الفضاء تحدد مستوى.
إذا أعطيتني ثلاث نقاط في مساحة ثلاثية الأبعاد، يمكنني من خلالها رسم مستوي واحدة فقط.
هذا ليس مضمونًا أن يكون صحيحًا بالنسبة للأشكال التي تحتوي على أربع نقاط أو أكثر. أيضًا، نقطتان لا تكفيان لإيجاد مستوى، بل خط فقط، لذا فإن ثلاثة نقاط هي العدد المثالي والأقل.
يعتبر عرض الإطار السلكي رائعًا ويمكن أيضًا ملء جميع الرسومات ثلاثية الأبعاد.
وللقيام بذلك نحتاج الى الخوارزمية الكلاسيكية " "Scanline Rendering، والتي تم تطويرها لأول مرة في عام 1967 في جامعة يوتاه.
وللحصول على مثال بسيط، دعنا نفكر في مضلع واحد فقط.
مهمتنا هنا هي معرفة كيفية ترجمة هذا المضلع إلى وحدات بكسل ممتلئة على شاشة الكمبيوتر، لذلك أولاً علينا أن نغطي شبكة من وحدات البكسل لملئها.
لأن مضلعات المثلثات، إذا تقاطعت مع خط واحد، يجب أن تتقاطع مع خط آخر.
تتمثل مهمة خوارزمية "scanline " في ملء وحدات البكسل بين التقاطعين.
في الصف الأول ننظر إلى أنها تتقاطع في نقطتين. تقوم الخوارزمية بعد ذلك بتلوين جميع وحدات البكسل بين هذين التقاطعين. ويستمر هذا فقط، صفًا تلو الآخر، وهذا هو سبب تسميته
Scan ... Line ... Rendering.
عندما نصل إلى الجزء السفلي من المضلع، نكون قد انتهينا. يسمى المعدل الذي يملأ به الكمبيوتر في المضلعات معدل التعبئة. كما نرى هذا مضلع المملوء بشكل قبيح جدًا.
لديها تلك الحواف الخشنة ما يعرف باسم "Jaggies". يكون هذا التأثير أقل وضوحًا عند استخدام وحدات بكسل أصغر. لكن مع ذلك، ترى هذه الأشياء في الألعاب طوال الوقت، خاصة على المنصات ذات الطاقة المنخفضة.
تتمثل إحدى طرق تخفيف هذا التأثير في منع الحواف بدلاً من ملء وحدات البكسل في مضلع بنفس اللون، يمكننا ضبط اللون بناءً على مقدار قطع المضلع خلال كل بكسل.
إذا كان البكسل داخل مضلع بالكامل، فإنه يتم تلوينه بالكامل. ولكن إذا كان المضلع يمسح بكسلًا فقط، فسيحصل على لون أفتح. هذا الريش من الحواف أكثر متعة للعيون.
يتم استخدام الحماية من الحواف في كل مكان، بما في ذلك الرسومات ثنائية الأبعاد، مثل الخطوط والرموز. إذا كنت تميل بشكل حقيقي بالقرب من شاشتك وعند التقريب أكثر سترى أن جميع الخطوط في متصفحك غير متحيزة. ناعمة جدا!
في مشهد ثلاثي الأبعاد، توجد مضلعات عبارة عن كائنات جزئية في الخلف وبالقرب من الأمام وفي كل مكان تقريبًا. البعض فقط مرئي، لأن بعض الأشياء مخفية خلف أشياء أخرى في المشهد وهذا ما يسمى بالانسداد " occlusion".
الطريقة الأكثر مباشرة للتعامل مع هذا هي استخدام خوارزمية الفرز، وترتيب جميع المضلعات في المشهد من الأبعد إلى الأقرب، ثم عرضها بهذا الترتيب.
يُطلق على هذا اسم خوارزمية الرسام " Painter's Algorithm"، لأنه يتعين على الرسامين أيضًا البدء بالخلفية، ثم العمل بشكل متزايد للوصول إلى العناصر الأمامية.
ضع في اعتبارك هذا المشهد النموذجي بثلاثة مضلعات متداخلة.
لتسهيل متابعة الأمور، سنقوم بتلوين المضلعات بشكل مختلف. أيضًا من أجل التبسيط، سنفترض أن هذه المضلعات كلها موازية للشاشة، ولكن في برنامج حقيقي، مثل اللعبة، يمكن إمالة المضلعات في مساحة ثلاثية الأبعاد. المضلعات الثلاثة، B A و C ... على مسافة 20 و 12 و 14.
أول شيء تفعله خوارزمية الرسام هو فرز جميع المضلعات، من الأبعد إلى الأقرب.
الآن بعد أن أصبحت بالترتيب، يمكننا استخدام عرض خط المسح لملء كل مضلع، واحدًا تلو الآخر.
نبدأ بـ Polygon A، الأبعد.
ثم نكرر العملية للمضلع الأبعد التالي، في هذه الحالة، C. ثم نكرر مرة أخرى للمضلع B.
وعند الانتهاء يمكنك رؤية الترتيب الصحيح. المضلعات الأقرب في المقدمة!
طريقة بديلة لمعالجة الانسداد تسمى Z-Buffering. يحقق نفس الناتج كما كان من قبل، ولكن باستخدام خوارزمية مختلفة.
وعند العودة إلى مثالنا السابق، قبل أن يتم فرزه. وذلك لأن هذه الخوارزمية لا تحتاج إلى فرز أي مضلعات، مما يجعلها أسرع.
باختصار، Z-buffering يتتبع أقرب مسافة إلى المضلع لكل بكسل في المشهد. يقوم بذلك عن طريق الحفاظ على القيم الموجودة في الذاكرة وهو مجرد مصفوفة من Z-Buffer، في البداية، تتم تهيئة كل بكسل إلى ما لا نهاية.
ثم يبدأ التخزين المؤقت Z بالمضلع الأول في قائمته. في هذه الحالة، هذا هو A.
يتبع نفس منطق خوارزمية خط المسح، ولكن بدلاً من التلوين بالبكسل، فإنه يتحقق من مسافة المضلع مقابل ما يتم تسجيله في Z-Buffer.
يسجل أدنى القيمتين. بالنسبة إلى المضلع A الخاص بنا، بمسافة 20، فإنه يحل محل اللانهاية في كل مرة.
عندما يتم ذلك باستخدام المضلع A، ينتقل إلى المضلع التالي في قائمته، ويحدث نفس الشيء.
الآن، نظرًا لأننا لم نفرز المضلعات، فليس الأمر دائمًا أن تقوم المضلعات اللاحقة بالكتابة فوق القيم العالية. في حالة Polygon C، تحصل فقط بعض القيم في Z-buffer على مسافات دنيا جديدة.
يتم استخدام Z-buffer المكتمل هذا جنبًا إلى جنب مع إصدار أكثر روعة من عرض scanline الذي لا يختبر تقاطع الخط فحسب، بل يقوم أيضًا بالبحث لمعرفة ما إذا كان هذا البكسل سيكون مرئيًا في المشهد النهائي. إذا لم يكن الأمر كذلك، فإن الخوارزمية تتخطاه وتستمر.
تظهر مشكلة مثيرة للاهتمام عندما يكون هناك مضلعان لهما نفس المسافة، مثلاً إذا كان المضلعان A وB كلاهما على مسافة 20. أيهما ترسم في الأعلى؟
يتم خلط المضلعات باستمرار في الذاكرة ويتغير ترتيب الوصول الخاص بها.
بالإضافة إلى ذلك، أخطاء التقريب المتأصلة في حسابات الفاصلة العائمة. لذلك، غالبًا ما لا يمكن التنبؤ بأي شخص يتم رسمه في الأعلى.
والنتيجة هي تأثير الخفقان المسمى Z-Fighting، والذي إذا لعبت ألعابًا ثلاثية الأبعاد، فلا شك أنك واجهته.
عند الحديث عن مواقع الخلل، هناك تحسين شائع آخر في الرسومات ثلاثية الأبعاد يسمى
Back-Face Collin.
إذا فكرت في الأمر، فالمثلث له جانبان، أمامي وخلفي. بشيء مثل رأس الصورة الرمزية، أو الأرض في اللعبة، يجب أن ترى جانبًا واحدًا فقط - الجانب المواجه للخارج.
لذلك لتوفير وقت المعالجة، غالبًا ما يتم تجاهل الجانب الخلفي للمضلعات في خط أنابيب العرض، مما يقلل عدد أوجه المضلع التي يجب وضعها في الاعتبار إلى النصف.
هذا أمر رائع، إلا في حالة وجود خطأ يسمح لك بالدخول إلى داخل تلك الكائنات والنظر إلى الخارج. ثم يصبح رأس الصورة الرمزية أو الأرض غير مرئية.
كما نحتاج إلى التحدث عن الإضاءة لأنه إذا كان مشهدًا ثلاثي الأبعاد، فيجب أن تختلف الإضاءة على سطح الكائنات. وعند العودة إلى شبكة إبريق الشاي. مع تلوين خط المسح في جميع المضلعات، يبدو إبريق الشاي لدينا هكذا. ليس 3D جدا. لذا، دعونا نضيف بعض الإضاءة لتعزيز الواقعية!
كمثال، سنختار ثلاثة مضلعات من أجزاء مختلفة من إبريق الشاي.
يُطلق على الاتجاه الذي يواجهون اسم السطح العادي، ويمكننا تصور هذا الاتجاه باستخدام سهم صغير ثلاثي الأبعاد يكون عموديًا على سطح المضلع. وعند اضافة مصدر ضوء.
سيتم إضاءة كل مضلع بمقدار مختلف. سيبدو البعض أكثر سطوعًا، لأن زاويته تتسبب في انعكاس المزيد من الضوء تجاه العارض.
على سبيل المثال، يتم إمالة المضلع الموجود في الجزء السفلي لأسفل بعيدًا عن مصدر الضوء، مما يعني أنه سيكون مظلمًا.
بطريقة مماثلة، يكون المضلع الموجود في أقصى اليمين متجهًا بعيدًا قليلاً عن الضوء، لذلك سيكون مضيئًا جزئيًا. وأخيرًا، هناك المضلع الأيسر العلوي. تعني زاويته أنه سيعكس الضوء من مصدر الضوء باتجاه رؤيتنا. لذا، ستبدو مشرقة. وإذا طبقنا ذلك مع كل مضلع، فإن إبريق الشاي الخاص بنا يبدو هكذا وهو أكثر واقعية!
يُطلق على هذا الأسلوب اسم " Flat Shading "، وهو يمثل خوارزمية الإضاءة الأساسية.
لسوء الحظ، فإنه يجعل كل حدود المضلع ملحوظة حقًا والشبكة لا تبدو سلسة.
لهذا السبب، تم تطوير خوارزميات إضاءة أكثر تقدمًا، مثل Guiraud Shading وPhung Shading. بدلاً من التلوين في المضلعات باستخدام لون واحد فقط، يغيرون اللون عبر السطح بطرق ذكية، مما ينتج عنه إخراج أجمل بكثير.
نحتاج أيضًا إلى الحديث عن الزخارف، والتي تشير في الرسومات إلى مظهر السطح، وليس الإحساس به.
كما هو الحال مع الإضاءة، هناك العديد من أنواع الخوارزميات بكل التأثيرات الخيالية. الأبسط هو رسم الخرائط النسيجية. لتصور هذه العملية، دعنا نعود إلى المضلع الفردي.
عندما نملأ هذا، باستخدام عرض خط المسح، يمكننا البحث عن اللون الذي يجب استخدامه في كل بكسل وفقًا لصورة نسيج محفوظة في الذاكرة.
للقيام بذلك، نحتاج إلى تعيين بين إحداثيات المضلع وإحداثيات النسيج. دعنا ننتقل إلى البكسل الأول الذي يحتاج عرض خط المسح الضوئي لملئه.
ستستشير خوارزمية التركيب النسيج في الذاكرة، وتأخذ متوسط اللون من المنطقة المقابلة، وتعبئ المضلع وفقًا لذلك.
تتكرر هذه العملية لجميع وحدات البكسل في المضلع، وهذه هي الطريقة التي نحصل بها على الزخارف.
إذا جمعت كل التقنيات التي تحدثنا عنها، سنحصل على إبريق شاي صغير رائع.
ويمكن أن يجلس إبريق الشاي هذا في مشهد أكبر، يتكون من ملايين المضلعات.
يتطلب تقديم مشهد كهذا قدرًا معقولاً من الحساب. ولكن الأهم من ذلك، أنه نفس النوع من الحسابات التي يتم إجراؤها مرارًا وتكرارًا للعديد من الملايين من المضلعات - ملء خط المسح، ومنع الحواف، والإضاءة، والتركيب. ومع ذلك، هناك طريقتان لجعل هذا أسرع بكثير!
أولاً، يمكننا تسريع الأمور من خلال امتلاك أجهزة خاصة بها أجراس وصفارات إضافية فقط لهذه الأنواع المحددة من الحسابات، مما يجعلها بسرعة البرق. وثانيًا، يمكننا تقسيم مشهد ثلاثي الأبعاد إلى عدة أجزاء أصغر، ثم نجعل كل القطع على التوازي، وليس بالتتابع.
لم يتم تصميم وحدة المعالجة المركزية لهذا الغرض، لذا فهي ليست سريعة بشكل كافي.
لذلك، أنشأ مهندسو الكمبيوتر معالجات خاصة للرسوميات فقط - وحدة معالجة الرسوميات.
يمكن العثور عليها على بطاقات الرسوميات داخل جهاز الكمبيوتر الخاص بك، إلى جانب ذاكرة الوصول العشوائي المخصصة للرسوميات. هذا هو المكان الذي تكون فيه جميع الشبكات والأنسجة، مما يسمح بالوصول إليها بسرعة فائقة من خلال العديد من النوى المختلفة لوحدة معالجة الرسومات في وقت واحد.
تحتوي بطاقة الرسوميات الحديثة، مثل GeForce GTX 1080 TI، على 3584 نواة معالجة، مما يوفر موازاة هائلة. يمكنه معالجة مئات الملايين من المضلعات كل ثانية!