بكسلة التحويل المسحي
الخطوة الأخيرة في عملية التسامت بشكلها القياسي يتم فيها ملء المثلثات الثنائية الإحداثيات والموجودة في مستوى سطح الصورة الثنائي البعد، ويطلق على هذه الخطوة أيضاً «التحويل المسحي» (scan conversion). إن أول مشكلة تتبادر إلى أذهاننا في هذه المرحلة هي: هل نقوم برسم البكسل الحالي أم لا؟ حيث أنه لكي يتم رسم وإظهار أي بكسل، فإنه يجب أن يتواجد ضمن أي من المثلثات، ولا بد ألا يتم حجبه (occluded) عن طريق بكسل أو مثلث أخر. إن خوارزم خط المسح (scanline) هو أحد أشهر الخوارزميات الشائعة في عملية التحويل المسحي (لفحص وملئ البكسلات داخل مثلث محدد). ولأنه من الصعب أن نعرف إذا كان المُسامِت سيقوم برسم البكسلات من الأمام للخلف، فلابد من وجود طريقة أكثر تحديداً لضمان أن البكسلات التي يتم رسمها في الأمام، التي تمثل الأشياء الأقرب إلى الناظر، لن يتم استبدالها ورسم البكسلات البعيدة مكانها، ولحسن الحظ فإن هناك بعض التقنيات التي تحل هذه المشكلة وأشهرها تقنية مخزن العمق (Z-buffer)، ومخزن العمق هو عبارة عن مصفوفة قيم ثنائية البعد تناظر تماماً في حجمها حجم مستوى سطح الصورة، ولكن يتم تخزين قيم العمق لكل بكسل في هذه المصفوفة، وعندما يتم رسم أي بكسل لأول مرة فإنه يقوم بتحديث قيمة العمق المناظرة له في مخزن العمق، وعند رسم أي بكسل فإنه يتم اختبار قيمة العمق الخاصة به مع قيمة العمق المخزنة حالياً في المكان المناظر له في مخزن العمق، وبالتالي فإن البكسلات الأقرب في الأمام (للناظر) سيتم رسمها بينما يتم تجاهل البكسلات الأبعد. لكي نرسم بكسل معين فإننا نحتاج لمعرفة لون هذا البكسل، وهنا نستخدم تقنيات التظليل وحسابات قيم الإكساءات (textures). ولتحديد مظهر أي مثلث فإننا نقوم بتطبيق وتوصيف خريطة بكسلات لونية (صورة نقطية) يطلق عليها خريطة إكساء (texture map)، حيث يتم ربط وتوصيف كل رأس من رؤوس المثلث مع الإكساء بوسطة ما يسمى بـ احداثيات الإكساء texture coordinate (u, v) وذلك في حالة استخدام الإكساءات الثنائية، ويتم تخزين قيم إحداثيات الإكساء مع كل رأس من رؤوس المثلث بجانب الإحداثي الفراغي الخاص به. عندما نقوم برسم بكسل معين فإننا نقوم أولاً بإيجاد لون البكسل المناظر له من الإكساء (عُنساء texel)، حيث نقوم بعمل استيفاء بين القيم اللونية من خريطة الإكساء لرؤوس المثلث الثلاثة التي يقع فيها هذا البكسل وذلك بحساب المسافة بين هذا البكسل والمسافة بين البكسلات الخاصة بكل رأس من رؤوس المثلث. يتم هذا الاستيفاء في حالة الإسقاط المنظوري بطريقة مختلفة قليلاً حيث يتم الاستيفاء بين إحداثيات الإكساء وبقسمة كل منهم بقيمة العمق الخاصة بهذا الرأس، وذلك للتخلص من مشكلة تشويه تسمى بـالتشوه المنظوري perspective foreshortening (في عملية تسمى بـالإكساء المنظوري perspective texturing). لون البكسل النهائي يتأثر أيضاً بحسابات الضوء (lighting) والتي يجب أن تتم للتعديل على قيمة البكسل اللونية حيث يتم تظليل البكسل، ويتأثر ذلك بكمية الضوء المتواجدة في المشهد. أنواع الضوء التي قد تتواجد في أي مشهد بشكل عام ثلاثة أنواع: (1) ضوء اتجاهي (directional light) ويعبِر عن الضوء الذي يأتي من اتجاه واحد وتكون شدة الضوء فيها ثابتة في المشهد كله حتى لو بعدت المسافة، فمثلاً ضوء أشعة الشمس في حياتنا العادية يقترب جداً من كونه ضوء اتجاهي، حيث أن الشمس والتي هي بعيدة جداً تبعث أشعة الضوء والتي تظهر متوازية لمن يراقب وينظر إلى الأرض، وتكون قيمة هبوط شدة الضوء (falloff) صغيرة جداً ومُهملة. (2) ضوء نقطي (point light) ويعبر عن الضوء الذي له مكان محدد في الفراغ وتنبعث الأشعة منه في كل الاتجاهات، ويتأثر الضوء النقطي بظاهرة الاضمحلال (attenuation) حيث أن شدة الضوء تهبط كلما ابتعدنا عن مكان مصدر الضوء. لاحظ أن مصادر الضوء في حياتنا تهبط شدتها بمعدل تربيعي بالتناسب مع المسافة. (3) ضوء بُقعي (يشبه ضوء الكشاف) spotlight وهو عبارة عن ضوء له مكان واتجاه محدد في الفراغ وله زاوية تحدد المخروط الذي يمثل بقعة الضوء. النوع الأخير من أنواع الضوء يسمى الضوء المحيطي (ambient) وهو عبارة عن قيمة ثابتة تضاف لحسابات الضوء للتعويض عن تأثير الإنارة العامة (global illumination) والتي لا تستطيع عملية التسامت العادية محاكاتها وحسابها بطريقة دقيقة وصحيحة. هناك العديد من خوارزميات التظليل المستخدمة في محركات المُسامتة (المحركات التي تقوم بعملية التسامت)، وكل هذه الخوارزميات تعتمد على المسافة بين الجسم (object) المراد تظليله (إضاءته وتلوينه) وبين مصدر الضوء وتعتمد أيضاً على الناظم (متجه الوحدة العمودي) normal vector للجسم المراد تظليله نسبة إلى اتجاه الضوء. الخوارزم الأسرع والمعروف بـالتظليل المسطح (flat-shading) يقوم بتظليل كل البكسلات التابعة لمثلث محدد بقيمة ضوئية ثابتة. وبالتالي لا يمكن إنشاء أسطح ذات مظهر ناعم بهذه الطريقة إلا لو قمنا بتقسيم الكائنات في المشهد لتتكون من مثلثات صغيرة جداً وكثيرة. هناك خوارزم آخر يسمى تظليل غوروه (Gouraud shading) ويقوم هذا الخوارزم بتظليل رؤوس المثلثات بشكل منفصل، فعندما يتم رسم البكسلات، يقوم باستيفاء القيمة الضوئية من الرؤوس. أما الخوارزم الأكثر دقة وبطئاً فيقوم بحساب القيمة الضوئية لكل بكسل منفصل على حدة والتي تعرف باسم تظليل فونغ، حيث يستخدم نوع استيفاء خطي ثنائي (bilinear interpolation) للنواظم ويُستخدم الناتج لحساب القيمة الضوئية اللونية مَحلياً.