Godot/2d/2d lights and shadows

من موسوعة حسوب
< Godot
مراجعة 22:35، 11 أكتوبر 2023 بواسطة Naser-dakhel (نقاش | مساهمات) (إضافة الصفحة)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)
اذهب إلى التنقل اذهب إلى البحث

الأضواء والظلال ثنائية الأبعاد

مقدمة

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

بدون أضواء أو ظل ثنائي البعد، المشهد غير مظلل
مع تفعيل الضوء ثنائي البعد (بدون ظلال)
مع تفعيل الضوء والظلال ثنائية البعد

العُقَد

هناك عدد من العقد المشاركة في إعداد مشهد إضاءة متكامل ثنائي البعد

  • CanvasModulate  (لجعل باقي المشهد مظلم)
  • PointLight2D  (من اجل الإضاءة متعددة الجهات omnidirectional أو النقطية)
  • DirectionalLight2D  (من أجل ضوء الشمس أو القمر)
  • LightOccluder2D  (من أجل نشر الظلال shadow casters)
  • عقد ثنائية البعد أُخرى تستقبل الإضاءة مثل Sprite2D أو TileMap

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

تُستخدم عُقَد Sprite2D لإظهار الملمس لنقط الضوء والخلفية وناشر الظلال.

تُستخدم عُقَد PointLight2D لإضاءة المشهد. الطريقة التي يعمل بها الضوء عادة هي إضافة ملمس texture معين على باقي المشهد لمحاكاة الإضاءة.

تُستخدم عُقَد LightOccluder2D  لإخبار الظلال أي جزء من المشهد ينشر ظلًّا، يمكن وضع هذه الحواجب occluders كعقد مستقلة أو يمكن أن تكون جزءًا من عقدة TileMap.

تظهر الظلال فقط في مناطق مغطاة بعقدة PointLight2D ويعتمد اتجاهها على مركز العقدة Light.

ملاحظة: لا تحصل ألوان الخلفية على أي إضاءة. يجب إضافة تمثيل بصري للخلفية مثل Sprite2D إذا أردت إضاءة الخلفية. يمكن أن تفيد خصائص المنطقة الخاصة بالعقدة Sprite2D بإنشاء ملمس خلفية متكررة بسرعة ولكن تذكر أن تفعّل الخيار Texture > Repeat لتفعيل خصائص Sprite2D.

الأضواء النقطية

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

تقدم العقدة PointLight2D الخصائص التالية التي يمكنك تعديلها في المحرر:

  • الملمس Texture: الملمس المُستخدم كمصدر ضوء، إذ يحدد حجم الملمس حجم الضوء. يمكن أن يكون للملمس قناة ألفا تفيد عند استخدام نمط الدمج "مزج mix" الخاص بالعقدة Light2D، ولكنه غير مفيد عند استخدام إضافة (الافتراضي) أو إنقاص أنماط الدمج.
  • الإزاحة Offset: إزاحة ملمس الضوء، ولا يسبب تغيير الإزاحة تحريك الظلال على عكس نقل عقدة الضوء.
  • تدرج الملمس Texture Scale: مُضاعف حجم الضوء. تزيد القيم الأعلى مدى الضوء. تؤثر الأضواء الكبيرة على الأداء أكثر لأنها تؤثر على بيكسلات أكثر من الشاشة لذا خذ ذلك بعين الاعتبار عند زيادة حجم الضوء.
  • الارتفاع Height: ارتفاع الضوء الافتراضي بالنسبة للربط العادي. إن الضوء قريب جدًا للسطح الذي يتلقاه، هذا يجعل الإضاءة غير ملحوظة إذا استُخدم الربط العادي، لذا تذكر زيادة القيمة هذه. يؤدي ضبط ارتفاع الضوء إلى إحداث فرق واضح فقط على الأسطح التي تستخدم الربط العادي.

إذا لم يكن لديك أي ملمس texture مُنشأ مسبقًا لاستخدامه في الضوء، يمكنك استخدام ملمس الضوء النقطي "المحايد" (نقرة بالزر الأيمن > حفظ الصورة باسم ...).

ملمس ضوء نقطي محايد


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

الضوء الاتجاهي

من الميزات الجديدة في جودو 4.0 هي القدرة على الحصول على ضوء اتجاهي directional light ثنائي البعد. يُستخدم الضوء الاتجاهي لتمثيل ضوء الشمس أو القمر. تُسقط أشعة الضوء بشكل متوازي كأن الشمس أو القمر بعيدان عن السطح المُضاء بشكل لانهائي.

تحتوي العقدة DirectionalLight2D على الخصائص التالية:

  • الارتفاع Height: ارتفاع الضوء الافتراضي مقارنة بالربط العادي normal mapping (0.0= موازي للسطح و1.0= متعامد مع السطح). يكون الضوء افتراضيًا موازي للسطح المُضاء، ما يجعل من الإضاءة غير واضحة إذا استخدم الربط العادي، لذا تذكر زيادة هذه القيمة. تعديل ارتفاع الضوء يعطي فرقًا فقط في الأسطح التي تستخدم الربط العادي. لا يؤثر الارتفاع Height على مظهر الظلال.
  • المسافة القصوى Max Distance: المسافة القصوى من مركز الكاميرا إلى الكائنات قبل أن يتم منع ظلالها (واحدتها بيكسل). إنقاص هذه القيمة يمنع الكائنات خارج الكاميرا من نشر ظلالها (وبالتالي تحسين الأداء). لا يؤخذ بعين الاعتبار التكبير الخاص بعقدة Camera2D في المسافة القصوى Max Distance، أي ستظهر الظلال بأنها تخبو بشكل أسرع في قيم التكبير الأعلى عند التكبير إلى نقطة معينة.

ملاحظة: ستظهر الظلال الاتجاهية بأنها طويلة إلى اللانهاية بغض النظر عن قيمة خاصية الارتفاع. يعد هذا أحد قيود من تابع تصيير الظلال المستخدم في الضوء ثنائي البعد في جودو. يجب تعطيل الظلال في DirectionalLight2D للحصول على ظلال ليست بطويلة إلى اللانهاية واستخدام مظلل خاص يقرأ حقل المسافة ثنائي البعد المؤشر إليه. يُنشأ حقل المسافة تلقائيًا من عقد LightOccluder2D الموجودة في المشهد.

خائص الضوء المشتركة

  • مفعل Enabled: يسمح باختيار ظهور الضوء. على عكس إخفاء عقدة الضوء، تعطيل هذه الخاصية لا يخفي أولاد الضوء
  • المحرر فقط Editor Only: يظهر الضوء فقط في المحرر عند تفعيله، ويتم تعطيله تلقائيًا عند تنفيذ المشروع
  • اللون Color: لون الضوء
  • الطاقة Energy: مضاعف شدة الضوء. القيم الأعلى تعطي ضوء أكثر سطوعًا
  • نمط الدمج Blend Mode: معادلة الدمج المستخدمة لحسابات الضوء. القيمة الافتراضية أضف هي المناسبة لمعظم الحالات. يمكن استخدام اطرح للضوء السلبي التي ليست دقيقة فيزيائيًا ولكن يمكن استخدامها للتأثيرات الخاصة. يمزج نمط الدمج قيم البيكسلات الموافقة لملمس الضوء مع قيم البيكسلات تحته عن طريق التوليد الخطي
  • Range > Z Min: قيمة Z الدنيا التي تتأثر بالضوء.
  • Range > Z Max: قيمة Z العليا التي تتأثر بالضوء.
  • Range > Layer Min: الطبقة البصرية الأدنى التي تتأثر في الضوء
  • Range > Layer Max: الطبقة البصرية الأعلى التي تتأثر في الضوء .
  • Range > Item Cull Mask: يتحكم بأي عقد تتلقى الضوء من هذه العقدة اعتمادًا على العقد المفعلة في الطبقات البصرية الخاصة بقناع ضوء الحاجب Occluder Light Mask، ويمكن استخدام هذا لمنع كائنات معينة من تلقي الضوء.

ضبط الظلال

لن ترى أي فرق بصري في البداية بعد تفعيل خاصية الظلال (Shadow > Enabled) في العقدتين PoinLight2D وDirectionalLight2D. هذا لأن العقد لا تحوي في المشهد أي حواجب occluders بعد، التي تُستخدم بدورها كأساس لنشر الظلال.

يجب إضافة عقد LightOccluders2D للمشهد لتظهر الظلال فيه. يجب أن تحوي هذه العقد أيضًا حواجب مضلعة occluder polygons التي تستخدم لتطابق الإطار الخارجي للسبرايت sprite.

يوجد لدى العقد LightOccluder2D خاصيّتان بالإضافة لمورد المضلع المرافق (الذي يجب أن يُضبط ليكون هناك أي تأثير بصري):

  • اصطدامات SDF: سيكون الحاجب جزء من حقل المسافة المؤشر المُنشأ بالوقت الفعلي الذي يمكن استخدامه في مظللات shader خاصة. عند عدم استخدام التظليل المخصص الذي يقرأ من SDF، فإن تفعيل ذلك ليس له تأثير بصري ولا على الأداء، لذا يكون مفعل افتراضيًا للسهولة.
  • قناع ضوء الحاجب Occluder Light Mask: يستخدم ذلك بالتوازي مع خاصية Shadow > Item Cull Mask الخاصة بـ PointLight2D و DirectionalLight2D للتحكم في أي كائن ينشر ظله من أجل أي ضوء. هذا يُستخدم لمنع كائنات معينة من نشر الظل.

هناك طريقتان لإنشاء حواجب الضوء:

حواجب الضوء المُنشأة تلقائيًا

يمكن إنشاء الحواجب من عقد Sprite2D عن طريق اختيار العقدة والنقر على قائمة Sprite2D في أعلى محرر 2D واختيار Create LightOccluder2D Sibling.

في مريع الحوار الظاهر، سيحدد إطار خارجي حواف السبرايت الخاص بك. يمكن النقر على OK إذا كان الإطار يطابق حواف السبرايت بشكل جيد. إذا كان الإطار بعيدًا عن حواف السبرايت (أو إنه داخل "يأكل" حواف السبرايت) عدل القيمتين Grow (pixels)‎ أو Shrink (pixles)‎ ثم انقر على Update Preview. كرر هذه العملية حتى تحصل على نتيجة مُرضية.

رسم حواجب الضوء يدويًا

أنشئ عقدة LightOccluder2D ثم اختر العقدة واضغط على زر "+" في أعلى محرر ثنائي الأبعاد. عندما يُطلب منك إنشاء مورد مضلع أجب موافق، ثم يمكن البدء برسم موشور الحاجب عن طريق النقر لإنشاء نقط جديدة. يمكن إزالة النقط الموجودة عن طريق النقر بالزر اليمين عليها، ويمكن إنشاء نقط جديدة من الخط الموجود عن طريق النقر والسحب على السطر.

يمكن تعديل الخواص التالية على الأضواء ثنائية البعد التي لديها ظلال مفعلة:

  • اللون Color: لون المناطق المظللة. تكون المناطق المُظللة افتراضيًا سوداء، ولكن يمكن تغيير ذلك لأسباب فنية. تتحكم القناة ألفا الخاصة باللون كمية الظل في اللون المحدد
  • الفلتر Filter: نمط الفلتر للاستخدام مع الظلال. النمط الافتراضي None هو الأسهل في التصيير ويناسب الألعاب من نوع Pixel Art (لرسوماته "الكتلية"). إذا اردت ظلال أنعم استخدم PCF5 بدلًا عن ذلك. إن PCF13 هي أكثر نعومة ولكنها أكثر صعوبة في التصيير، ويجب استخدامه في عدد قليل من الأضواء بوقت واحد بسبب صعوبة تصييره.
  • نعومة الفلتر Filter Smooth: يتحكم بكمية النعومة المطبقة على الفلتر عند ضبطه إلى PCF5 أو PCF13. تعطي القيم الأعلى ظلال أنعم، ولكنها تسبب بعض مشاكل الخطوط البصرية (خصوصًا مع PCF5)
  • قناع عنصر تحديد التصيير Item Cull Mask: يتحكم في أي عقدة LightOccluder2D تنشر ظلال، اعتمادًا على خاصيات Occluder Light Mask
ظلال قاسية
ظلال ناعمة (PCF13، نعومة الفلتر 1.5)
ظلال ناعمة مع مشاكل خطوط بصرية كون نعومة الفلتر عالية (PCF5 نعومة الفلتر 4)

ترتيب رسم الحاجب

تتبع عقدة LightOccluder2D نفس ترتيب الرسم ثنائي البعد. إن هذا مهم للإضاءة ثنائية البعد لأنها الطريقة التي تتحكم فيما  إذا كان الحاجب يجب أن يحجب السبرايت نفسه أو لا.

سيحجب الحاجب السبرايت نفسه إذا كانت عقدة LightOccluder شقيقة السبرايت في موضع تحت السبرايت في شجرة المشهد.

سيحجب الحاجب السبرايت نفسه إذا كانت عقدة LightOccluder ولد السبرايت وكان أظهر ما خلف الوالد معطلًا في عقدة LightOccluder2D (هذا هو الافتراضي).

الربط العادي والمنظاري

يزيد الربط العادي normap maps والمنظاري specular maps عمق الإضاءة ثنائية البعد. يمكن للربط العادي جعل الإضاءة أقل تسطحًا مثل التصيير ثلاثي الابعاد عن طريق تغيير الشدة اعتمادًا على جهة السطح متلقي الضوء (على أساس كل بيكسل). ويحسن الربط المنظاري العناصر المرئية عن طريق عكس بعض الضوء على الناظر.

تدعم كلًّا من PointLight2D وDirectionalLight2D الربط العادي والمنظاري. يمكن إسناد الربط العادي والمنظاري إلى أي عنصر ثنائي البعد منذ جودو 4.0 وحتى العقد التي ترث من Node2D وعقد التحكم.

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

يحدد  الربط المنظاري كمية الضوء الذي يعكسه كل بيكسل (وأي لون إذا كان الربط المنظاري يحتوي لون). تعطي القيم الأعلى انعكاس أكثر سطوعًا على نقطة معينة على الملمس. يُنشأ الربط المنظاري عادة بالتحرير التلقائي باستخدام ملمس النشر كقاعدة

نصيحة:يمكن استخدام الأداة Laigter المجانية والمفتوحة المصدر لإنشاء الربط العادي والمنظاري للسبرايت الخاصة بك إذا لم يكن الربط متوافرًا لديك.

أنشئ مورد CanvasTexture لضبط الربط العادي و/أو المنظاري على عقدة ثنائية البعد للخاصية التي ترسم ملمس العقدة. مثلًا على Sprite2D

إنشاء مورد CanvasTexture لعقدة Sprite2D

وسع المورد المُنشأ حديثًا تجد العديد من الخاصيات التي تحتاج لتعديلها

  • Diffuse > Texture: لون الملمس الأساسي. حمّل الملمس الذي تستخدمه للسبرايت نفسه في هذه الخاصية
  • Normal Map > Texture: ملمس ربط عادي. حمّل ملمس الربط العادي الذي أنشأته من ربط الارتفاع في هذه الخاصية (راجع النصيحة السابقة)
  • Specular > Texture: ملمس الربط المنظاري، الذي يتحكم بشدة بروق كل بيكسل على ملمس النشر. عادة ما يكون الربط المنظاري بتدرج رمادي ولكن يمكن أن يحتوي على لون لمضاعفة لون الانعكاسات كما يُناسب. حمّل ملمس الربط المنظاري الذي أنشأته في هذه الخاصية (راجع النصيحة السابقة)
  • Specular > Color: مضاعف اللون للانعكاسات المنظارية
  • Specular > Shininess: الأس المنظاري المستخدم للانعكاسات. تزيد القيم الأدنى شدة الانعكاسات وجعلها أكثر انتشارًا وتجعل القيم الأعلى الانعكاسات محلية أكثر. القيم الأعلى مناسبة للأسطح ذات المظهر الرطب.
  • Texture > Filter: تُستخدم لإعادة تعريف نمط فلترة الملمس بغض النظر عن ماهو ضبط خاصية العقدة (أو استخدم خاصة المشروع Rendering > Textures > Canvas Textures > Default Texture)
  • Texture > Repeat:  تُستخدم لإعادة تعريف نمط فلترة الملمس بغض النظر عن ماهو ضبط خاصية العقدة (أو استخدم خاصة المشروع Rendering > Textures > Canvas Textures > Default Texture Repeat)

ستلاحظ بعد تفعيل الربط العادي أن الضوء الخاص بك أضعف. لحل ذلك زد خاصية الارتفاع في العقد PointLight2D وDirectionalLight2D. يمكن أيضًا زيادة خاصية الطاقة في الضوء الخاص بك قليلًا للحصول على شدة الضوء الخاصة قبل تفعيل الربط العادي

استخدام سبرايت إضافية كبديل سريع للأضواء ثنائية الأبعاد

إذا واجهت بعض مشاكل الأداء عند استخدام الأضواء ثنائية الأبعاد، يمكن استبدال بعضهم بعقد Sprite2D التي تستخدم إضافات الدمج. هذا يُناسب الآثار الديناميكية قصيرة المدى، مثل الرصاص أو الانفجارات

السبرايت الإضافية أسرع في التصيير لأنها لا تحتاج إلى المرور عبر مسار تصيير مختلف. يمكن استخدام هذه المقاربة مع AnimatedSprites2D ( أو Sprite2D + AnimationPlayer) التي تسمح بإنشاء "أضواء" ثنائية البعد.

ولكن لدى السبرايت الإضافية بعض الجوانب السلبية مقارنة بالأضواء ثنائية البعد.

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

أنشئ عقدة Sprite2D وأسند ملمس إليها لإظهار السبرايت مع إضافة الدمج. انزل إلى قسم CanvasItem > Material في المحرر، افتحها وانقر على القائمة المنسدلة بجانب خاصية المواد. اختر New CanvasItemMaterial ، انقر على المادة المُنشأة لتعديلها واضبط Blend Mode إلى Add.