رسومات متجهة على وحدة معالجة الرسومات

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

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

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

نبدأ بـ رقم ملف مضبوط على الصفر. رقم الالتفاف هو عدد صحيح يشير إلى ما إذا كان مركز البكسل داخل الشكل أو خارجه.

بعد ذلك ، تخيل شعاعًا أفقيًا مسقطًا عبر مراكز كل وحدات البكسل في صف البكسل هذا. ينتقل راي من اللانهاية في الجانب الأيسر إلى اللانهاية في الجانب الأيمن. في كل مرة يتم فيها العثور على تقاطع مع مقطع علوي ، يتم زيادة رقم اللف بمقدار 1. عندما يتم العثور على تقاطع بمقطع سفلي ، يتم تقليل رقم اللف بمقدار 1. عندما نتحرك من بكسل إلى بكسل ، من اليسار إلى اليمين ، إذا كان رقم الملف الحالي في مركز كل بكسل هو صفر ، فإن البكسل غير مرئي. إذا كان هناك شيء آخر ، فسيتم ملء البكسل وفقًا لقاعدة التعبئة. على سبيل المثال ، بالنسبة لقاعدة التعبئة غير الصفرية ، تمتلئ جميع وحدات البكسل التي تحتوي على رقم التفاف بخلاف الصفر باللون.

في هذه الصورة ، يتم رسم الدائرة في اتجاه عقارب الساعة ، ولكن إذا تم رسمها عكس اتجاه عقارب الساعة ، فإن التقاطع على اليسار سيؤدي إلى تقليل عدد اللفات بمقدار 1 بدلاً من الزيادة.

الآن مراكز البكسل بين التقاطعين بها أرقام متعرجة من -1 ، ولكن وفقًا لقاعدة اللف غير الصفري ، يتم تعبئتها بنفس طريقة الدائرة في اتجاه عقارب الساعة.

لاحظ أنه يتم العثور على التقاطعات أثناء تحرك الشعاع من اليسار إلى اليمين بحيث يتم فرزها تلقائيًا حسب موضع X لكل تقاطع.

كرر نفس العملية لكل صف من وحدات البكسل للصورة الناتجة وستكتمل الصورة في النهاية.

بالطبع ، تحتوي أحدث أدوات التنقيط على الكثير من التحسينات وقد تبدو الخوارزميات الفعلية مختلفة تمامًا عن ذلك ، ولكن الفكرة الأساسية هي نفسها وهي تعمل مع مسارات Bezier بأي تعقيد. > افعل ذلك الآن على GPU.

لسوء الحظ ، تعمل وحدات معالجة الرسومات بشكل مختلف قليلاً عن وحدات المعالجة المركزية. المعالج مثل الشخص الذي يقرأ كتابًا. تبدأ من الصفحة 1 وتقرأ كل الصفحات واحدة تلو الأخرى بالترتيب. ولكن إذا كنت تقرأ كتبًا مثلي ، فقد يستغرق الأمر ما يصل إلى 6 سنوات لإنهاء كتاب. لذلك تجد طريقة أسرع. أنت توظف 14000 شخص لقراءة هذا الكتاب ، كل منهم يقرأ سطرًا واحدًا بالتوازي. انتهوا في حوالي 8 ثوان ، لكن هناك تحديات جديدة. عليك أن تجد طريقة لتعيين أي سطر بسرعة للقراءة لأي شخص وعندما يتم ذلك عليهم أن يخبروك بالقصة بأكملها بالترتيب. لا يمكنهم التحدث جميعًا في نفس الوقت بشكل عشوائي. هذا هو نوع التحديات التي تواجهها عند البرمجة لوحدات معالجة الرسومات.

وحدات معالجة الرسومات متوازية للغاية. يمكنهم تشغيل آلاف الخيوط في نفس الوقت. على سبيل المثال ، يمكن لوحدة معالجة الرسومات الأصلية Apple M1 تشغيل 24576 مؤشر ترابط بالتوازي. من الناحية المثالية ، يجب إعداد البيانات لوحدة معالجة الرسومات بطريقة تجعل كل هذه الخيوط تعمل مع كميات صغيرة من المعلومات وتنتج مخرجات أصغر حجمًا ثابتًا. هذا ليس مطلبًا ، خاصة لوحدات معالجة الرسومات الأكثر حداثة ، لكني أحب أن أبقيه بسيطًا بسبب عدم ثقتي في برامج تشغيل الرسومات. تنقيط بكسل واحد في كل مرة.

من الطرق البديهية للتنقيط على وحدة معالجة الرسومات هي بكسل واحد في كل مرة. تحتوي الشاشات على الكثير من وحدات البكسل ويمكن لوحدات معالجة الرسومات تشغيل الكثير من سلاسل العمليات. لذلك يبدو أنه يمكن معالجة كل بكسل بشكل متوازٍ.

للقيام بذلك ، نحتاج إلى تعديل الخوارزمية للعمل على كل بكسل على حدة بدلاً من معالجة كل شكل وكل جزء منه بالترتيب في سلسلة واحدة.

الآن لكل بكسل يتكرر عبر جميع أجزاء الشكل وإذا تجاوز أي مقطع هذا الخط الأفقي التخيلي عبر مركز ذلك البكسل ، يتم تغيير عدد الالتفاف. يجب مراعاة التقاطعات الموجودة على الجانب الأيسر من مركز البكسل فقط. يمكن تجاهل التقاطعات على الجانب الأيمن من مركز البكسل تمامًا. لا يهم ترتيب معالجة الشرائح.

في هذا المثال ، يوجد تقاطع واحد فقط يسار مركز البكسل المميز. لذلك إذا كنا ...

رسومات متجهة على وحدة معالجة الرسومات

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

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

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

نبدأ بـ رقم ملف مضبوط على الصفر. رقم الالتفاف هو عدد صحيح يشير إلى ما إذا كان مركز البكسل داخل الشكل أو خارجه.

بعد ذلك ، تخيل شعاعًا أفقيًا مسقطًا عبر مراكز كل وحدات البكسل في صف البكسل هذا. ينتقل راي من اللانهاية في الجانب الأيسر إلى اللانهاية في الجانب الأيمن. في كل مرة يتم فيها العثور على تقاطع مع مقطع علوي ، يتم زيادة رقم اللف بمقدار 1. عندما يتم العثور على تقاطع بمقطع سفلي ، يتم تقليل رقم اللف بمقدار 1. عندما نتحرك من بكسل إلى بكسل ، من اليسار إلى اليمين ، إذا كان رقم الملف الحالي في مركز كل بكسل هو صفر ، فإن البكسل غير مرئي. إذا كان هناك شيء آخر ، فسيتم ملء البكسل وفقًا لقاعدة التعبئة. على سبيل المثال ، بالنسبة لقاعدة التعبئة غير الصفرية ، تمتلئ جميع وحدات البكسل التي تحتوي على رقم التفاف بخلاف الصفر باللون.

في هذه الصورة ، يتم رسم الدائرة في اتجاه عقارب الساعة ، ولكن إذا تم رسمها عكس اتجاه عقارب الساعة ، فإن التقاطع على اليسار سيؤدي إلى تقليل عدد اللفات بمقدار 1 بدلاً من الزيادة.

الآن مراكز البكسل بين التقاطعين بها أرقام متعرجة من -1 ، ولكن وفقًا لقاعدة اللف غير الصفري ، يتم تعبئتها بنفس طريقة الدائرة في اتجاه عقارب الساعة.

لاحظ أنه يتم العثور على التقاطعات أثناء تحرك الشعاع من اليسار إلى اليمين بحيث يتم فرزها تلقائيًا حسب موضع X لكل تقاطع.

كرر نفس العملية لكل صف من وحدات البكسل للصورة الناتجة وستكتمل الصورة في النهاية.

بالطبع ، تحتوي أحدث أدوات التنقيط على الكثير من التحسينات وقد تبدو الخوارزميات الفعلية مختلفة تمامًا عن ذلك ، ولكن الفكرة الأساسية هي نفسها وهي تعمل مع مسارات Bezier بأي تعقيد. > افعل ذلك الآن على GPU.

لسوء الحظ ، تعمل وحدات معالجة الرسومات بشكل مختلف قليلاً عن وحدات المعالجة المركزية. المعالج مثل الشخص الذي يقرأ كتابًا. تبدأ من الصفحة 1 وتقرأ كل الصفحات واحدة تلو الأخرى بالترتيب. ولكن إذا كنت تقرأ كتبًا مثلي ، فقد يستغرق الأمر ما يصل إلى 6 سنوات لإنهاء كتاب. لذلك تجد طريقة أسرع. أنت توظف 14000 شخص لقراءة هذا الكتاب ، كل منهم يقرأ سطرًا واحدًا بالتوازي. انتهوا في حوالي 8 ثوان ، لكن هناك تحديات جديدة. عليك أن تجد طريقة لتعيين أي سطر بسرعة للقراءة لأي شخص وعندما يتم ذلك عليهم أن يخبروك بالقصة بأكملها بالترتيب. لا يمكنهم التحدث جميعًا في نفس الوقت بشكل عشوائي. هذا هو نوع التحديات التي تواجهها عند البرمجة لوحدات معالجة الرسومات.

وحدات معالجة الرسومات متوازية للغاية. يمكنهم تشغيل آلاف الخيوط في نفس الوقت. على سبيل المثال ، يمكن لوحدة معالجة الرسومات الأصلية Apple M1 تشغيل 24576 مؤشر ترابط بالتوازي. من الناحية المثالية ، يجب إعداد البيانات لوحدة معالجة الرسومات بطريقة تجعل كل هذه الخيوط تعمل مع كميات صغيرة من المعلومات وتنتج مخرجات أصغر حجمًا ثابتًا. هذا ليس مطلبًا ، خاصة لوحدات معالجة الرسومات الأكثر حداثة ، لكني أحب أن أبقيه بسيطًا بسبب عدم ثقتي في برامج تشغيل الرسومات. تنقيط بكسل واحد في كل مرة.

من الطرق البديهية للتنقيط على وحدة معالجة الرسومات هي بكسل واحد في كل مرة. تحتوي الشاشات على الكثير من وحدات البكسل ويمكن لوحدات معالجة الرسومات تشغيل الكثير من سلاسل العمليات. لذلك يبدو أنه يمكن معالجة كل بكسل بشكل متوازٍ.

للقيام بذلك ، نحتاج إلى تعديل الخوارزمية للعمل على كل بكسل على حدة بدلاً من معالجة كل شكل وكل جزء منه بالترتيب في سلسلة واحدة.

الآن لكل بكسل يتكرر عبر جميع أجزاء الشكل وإذا تجاوز أي مقطع هذا الخط الأفقي التخيلي عبر مركز ذلك البكسل ، يتم تغيير عدد الالتفاف. يجب مراعاة التقاطعات الموجودة على الجانب الأيسر من مركز البكسل فقط. يمكن تجاهل التقاطعات على الجانب الأيمن من مركز البكسل تمامًا. لا يهم ترتيب معالجة الشرائح.

في هذا المثال ، يوجد تقاطع واحد فقط يسار مركز البكسل المميز. لذلك إذا كنا ...

What's Your Reaction?

like

dislike

love

funny

angry

sad

wow