تسامت

التسامت (بالإنجليزية: Rasterization) هو عملية معالجة صورة ذات تنسيق ومحتوى رسوميات متجهية (vector graphics) (مجموعة أشكال) وتحويلها إلى صورة تسامتية raster row image (شبكة من النقاط تتكون غالباً من بكسلات أو عنصورات أو نقاط)، والهدف من عملية التسامت هو إتاحة عرض الصورة وإظهارها على أجهزة العرض المختلفة مثل الفيديو وشاشات الحاسوب أو لطباعتها، أو حتى لتخزينها في ملف ذو تنسيق صورة نقطية (bitmap file).

مقدمة

إن مصطلح "التسامت" يمكن بشكل عام تطبيقه ضمن أي عملية فيها بيانات ذات تنسيق متجهي بحيث يمكن تحويلها إلى تنسيق تسامتيّ. وفي حالة الاستخدام الشائع، يشير المصطلح إلى خوارزم التصيير المشهور لعرض الأشكال ثلاثية الأبعاد في الحاسوب. يعتبر التسامت حالياً أحد أشهر التقنيات المستخدمة لإنتاج رسوميات ثلاثية الأبعاد في الحاسوب في الزمن الفوري (real-time). إن تطبيقات الزمن الفوري تحتاج للاستجابة اللحظية لمدخلات المستخدم، وغالباً ما تحتاج لإظهار مشاهد تُعرض بمعدل لقطات لا يقل عن 25 لقطة في الثانية وذلك لضمان الحصول على حركة ناعمة لمحتويات المشهد. أسلوب التسامت هو عملية سريعة جداً إذا ما قورن بخوارزميات التصيير الأخرى مثل تتبع الأشعة (ray-tracing). ولكن التسامت هو عملية يتم فيها فقط حساب وتحويل مكونات ومحتويات المشهد إلى مجموعة بكسلات أو نقاط، مع العلم أنها لا تصف بشكل محدد كيف يتم حساب ألوان هذه البكسلات. حيث أن التظليل (shading) متضمناً التظليل القابل للبرمجة (programmable shading) قد يَستخدِم الخواص الفيزيائية لانتقال الضوء، أو الحدس الفني للرسام. يقدم معالج الرسوميات غالباً مجموعة من الوظائف الثابتة المحددة ضمن خط معالجة الرسوميات (graphics pipeline) حيث تحدث فيه عملية تسامت للمجسمات ثلاثية الأبعاد لإخراجها على سطح ثنائي البعد لعرضها على شاشة الحاسوب، ويحدث ذلك ضمن خط الإنتاج الثابت لعدم وجود دافع لتعديل التقنيات المستخدمة في عملية التسامت والتي تتم في زمن صغير جداً هو زمن رسم المشهد – حيث أن النظام الذي لا يُسمح بتعديله من الداخل فإنه غالباً يَسمح بتحقيق كفاءة عالية. حيث أن أغلب شاشات العرض الحديثة ذات توجه تسامتي، فإن عملية التسامت تتم على كل من الرسوميات المتجهية والرسوميات المتسامتة في أصلها، ولكن تحدث عملية التسامت لكل منهم في مكان مختلف، فيتم تسامت الرسوميات المتجهية في أجهزة العميل بينما تحفظ الرسوميات المتسامتة مسبقاً في جهاز الخادم.[1]

الطريقة الأساسية

إن أبسط خوارزم لعملية التسامت يَستلِم في مُدخلاته مشهد ثلاثي الأبعاد، مُكون من مجموعة من المضلعات، ويقوم بتصييره على سطح ثنائي البعد، والذي يكون عادة شاشة الحاسوب. المضلعات نفسها تتكون من مجموعة من المثلثات. المثلثات أيضاً يتم تمثيلها كمجموعة من النقاط أو الرؤوس (vertices) في فضاء العالم ثلاثي الأبعاد. عملية التسامت في أبسط صورها تستلم دفق أو فيض (stream) من مجموعة الرؤوس المدخلة وتقوم بتحويلهم إلى نقاط ثنائية البعد على شاشة العرض للمستخدم، وتقوم بإنشاء وملئ المثلثات ثنائية البعد الناتجة من هذه النقاط، في ما يعرف بالتحويل المسحي.

القص

بمجرد أن يتم تحويل رؤوس المثلثات من فضاء العالم الثلاثي الأبعاد لتصبح مجرد إحداثيات ثنائية، فإن بعضاً من هذه الإحداثيات قد يقع خارج حدود نافذة الرؤية أو خارج المنطقة التي تظهر فيها هذه النقاط أو الرسوميات على الشاشة. فنستخدم تقنية القص (clipping) حيث في هذه العملية يتم حذف كل المثلثات والنقاط التي تقع خارج حدود منطقة الرؤية بحيث لا يتم رسم أي نقاط إلا التي تقع ضمن حدود نافذة (منطقة) الرؤية. ساذرلاند-هودجمان Sutherland-Hodgeman هو أحد خوارزميات القص الأكثر شيوعاً، والذي يعمل كالآتي: يتم اختبار كل حافة من حواف مستوى سطح الصورة في كل مرة. ثم يتم اختبار كل النقاط المتوقع رسمها وتصييرها مع كل حافة، فإذا كانت إحدى هذه النقاط تقع خارج الحافة فسيتم حذفها وتجاهلها (إزالتها). بالمثل يتم اختبار كل حافة من حواف المثلثات والتي تتقاطع مع أي من حواف مستوى سطح الصورة، وهنا نرى أن نقطتي حافة المثلث تقع إحداهما خارج مستوى سطح الصورة فيتم إزالتها والأخرى داخل مستوى الصورة فيتم تمريرها.

التحويل المسحي

الخطوة الأخيرة في عملية التسامت بشكلها القياسي يتم فيها ملء المثلثات الثنائية الإحداثيات والموجودة في مستوى سطح الصورة الثنائي البعد، ويطلق على هذه الخطوة أيضاً "التحويل المسحي" (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) للنواظم ويُستخدم الناتج لحساب القيمة الضوئية اللونية مَحلياً.

تقنيات للتسريع وتحسين الاداء

للحصول على أعلى أداء من أي مُسامِت (محرك يقوم بعملية التسامت)، يجب أن نقلل من عدد المضلعات التي يتم إدخالها للمُصيير. هناك العديد من تقنيات تحسين الأداء التي طورت عبر السنين لإعدام (cull out) الأجسام التي لا يمكن رؤيتها.

إعدام الوجوه الخلفية

إن أبسط طريقة لتجاهل وإعدام المضلعات هي بإزالة المضلعات الغير مرئية التي تقع في الجهة البعيدة من الناظِر، ويطلق على هذه العملية: إعدام الوجوه الخلفية (backface culling). وحيث أن أغلب المجسمات هي مجسمات مُغلقة مُصمتة بشكل كامل، فإن المضلعات الخلفية والبعيدة عن الناظِر سيتم دائماً تغطيتها بالمضلعات الأمامية والتي تُواجِه الناظِر إلا إذا كان الناظر ينظر من داخل هذه المجسمات. يتم عادة تحديد وجهة أي مُضلع (facing) عن طريق الطواف (winding) ويمثل الترتيب الذي يتم فيه إرسال الرؤوس إلى المُصيير. ويَستخدم المُصيير طواف يدور عكس عقارب الساعة أو معها (طواف عكسي) لتحديد وجهة المضلع: أمامي أم خلفي؟ front or back facing. ثم يتم رسم المضلع فقط إذا كانت وجهته تواجه اتجاه الناظِر ويتم هذا الاختبار بعد أن يتم تحويل المضلع ليصبح في فضاء الشاشة (screen space). لاحظ أن تقنية "إعدام الوجوه الخلفية" لا يتم تطبيقها على المثلثات المتراكبة (degenerate) أو التي تقع ضمن حجوم غير مغلقة.

هياكل البيانات المكانية (spatial data structure)

هناك بعض التقنيات المتقدمة والتي تستخدم هياكل البيانات وذلك لتجاهل وإعدام أي مجسمات تقع خارج مجال الرؤية أو التي قد يتم حجبها بواسطة مجسمات أخرى أقرب. إن أشهر هياكل البيانات المستخدمة لهذا هي: تقسيم فراغي ثنائي (binary space partitions) والشجرة الثمانية (octree) والتجاهل بواسطة البوابات والخلايا (cell and portal culling).

تحسينات إضافية

برغم أن عملية التسامت معروفة منذ زمن إلا أن التطبيقات الحديثة ومع مرور الأيام تحاول أن تطبق بعض التحسينات والإضافات لزيادة مرونة وإمكانيات محرك التصيير والتسامت.

ترشيح الإكساء

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

إكساء البيئة

إكساء البيئة (environment mapping) هو أحد طرق توصيف الإكساءات بحيث أن قيم إحداثيات الإكساء تعتمد على مكان الناظِر. أحد أكثر التطبيقات شيوعاً على سبيل المثال عندما نريد محاكاة الانعكاسات (reflection) الموجودة على أجسام لامعة. وقد يقوم أحد الأشخاص مثلاً بإنشاء خريطة إكساءات بيئية للبيئة الداخلية لغرفة ما، ويقوم بتطبيق الإكساء على كأس موجود في وسط الغرفة ومكون من خامات مادة معدنية (metal material)، فعندما يتحرك الشخص داخل الغرفة حول الكأس فإن إحداثيات الإكساء الخاصة برؤوس الكأس تتحرك بالتبعية مما يعطي مظهر الانعكاس المعدني.

إكساء النتوءات

إكساء النتوءات (bump mapping) هو أحد الطرق الأخرى لتوصيف الإكساءات، حيث أن الإكساء في هذه الحالة لا يقدم قيم لونية للبكسلات، بل يقدم قيم تمثل عمق البكسلات عندما يتم تطبيقها على المسطحات والمضلعات، وبشكل خاص قد يُستخدم إكساء النتوءات مع بعض مظللات البكسلات (pixel shaders) لإنشاء إحساس يقدم مظهر خشونة المسطحات (roughness) بشكل يعتمد على الضوء وذلك لإضفاء مزيد من الواقعية وتحسين المظهر.

مستوى التفصيل

يزداد عدد المضلعات الموجودة في الكثير من مشاهد التطبيقات الحديثة، ولكن الناظر قد يحتاج فقط لأن يرى تفاصيل الأجسام القريبة منه وليس هناك داعي (يسبب عبئاً) لإظهار الأجسام البعيدة بدرجة تفصيل عالية، إن خوارزم التحكم في مستوى تفصيل وتعقيد المجسمات (level of detail) يقوم بالتعديل على تعقيد شكل المجسمات، بحيث يتغير ذلك كـتابع (function) يعتمد على المسافة بين الجسم والناظِر. فالأجسام القريبة جداً يتم إظهارها بأعلى مستوى من التفصيل ويتم تعديل مستوى التفصيل كلما ابتعدنا بشكل ديناميكي، والأجسام البعيدة جداً قد تُستبدل كلية ببعض الأشكال الشبحية (sprites).

الظلال

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

تحسين الأداء باستخدام العتاد

في بداية التسعينيات، ظهرت مُسرعات الأداء والتي أصبحت متاحة لمستخدمي أجهزة الحاسوب المنزلية بشكل عادي، وبينما كان مبرمجو التطبيقات الرسومية يعتمدون على كتابة أوامر منخفضة المستوى بلغة التجميع (Assembly) لتحسين أداء تطبيقاتهم، فإن أغلب البرامج الحديثة تُكتب الآن وتتخاطب مع بعض الواجهات (interfaces) ضمن مجموعة من الواجهات المخصصة (APIs) لتقديم خدمات للاستفادة من إمكانيات الرسوميات المتاحة، والتي بدورها تُدير وتتحكم في معالج الرسوميات (GPU). تقدم معالجات الرسوميات الحديثة والمتاحة هذه الأيام، الدعم لمظللات البكسلات القابلة للبرمجة والتي توفر للمبرمج الكثير من المرونة. ويستمر التطوير في هذا الاتجاه ليصبح خط إنتاج الرسوميات قابل للبرمجة بشكل كامل.

المراجع

"Concepts". Scalable Vector Graphics. W3C. 2003-01-14

راجع أيضاً

تحديد السطوح المخفية خوارزم برسنهام لرسم الخط، كأسلوب تقليدي في التسامت التصيير بواسطة المسح الخطي لتسامت خط بعد خط التصيير (رسوميات كمبيوتر) للمزيد من المعلومات العامة خط إنتاج الرسوميات للتسامت الذي يحدث داخل العتاد معالج تسامت الصورة للتسامت ثنائي البعد في أنظمة الطباعة الرسوميات المتجهية كمصادر رسومية رسوميات التسامت لرؤية النتائج تحويل التسامت إلى صورة متجهية كعملية عكسية للتسامت