2- شيدر نيران كرتونيه 2d في محرك يونِتي

unity

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

 وانتهينا من المبدأ الأساسي في التلاشي الخاص به ولكن تبقى بضعة أشياء لتضيف له نقله كبيره في شكله, وهذا تحديدا ما نكمله هذه المرة.

اضافة تدريج افضل 

في الحقيقة توجد طريقة اخرى لاضافة تدريج لا تظهر به المشكلة الخاصة بالنسيج, في حالة كونها بدقة منخفضة, وهذه الطريقة عن طريق عقدة اليوفي – UV.

ولهذا تبدأ اولا باضافتها, ومن ثم اضافة عقدة التقسيم – Split و توصيل عقدة اليوفي بها, وما تحتاجه منها هو مخرج الـ G, ولكن لن تستطيع رؤية ناتجة في العقدة نفسها.

لهذا توجد لدينا عقدة المعاينة – Preview, والتي من اسمها تقوم فقط بعرض او اظهار ما يتم توصيله في المدخل الخاص بها, وتكون مفيدة في حالة أن العقدة التي تريد رؤية نواتجها لا تظهر هذه النواتج في العقدة نفسها, مثل عقدة التقسيم التي لدينا هنا.

تجد الآن أن ما ظهر لك هو تدريج آخر مختلف قليلا عن نسيج التدريج الذي اضفته, مع كون اتجاهه معكوسا ايضا.

ربما خمنت بالفعل كيفية حل مشكلة هذا الانعكاس, وبالفعل عن طريق عقدة واحد ناقص – One Minus, والان وصل مخرج الـ G بعقدة الـ One Minus, وليس مخرج عقدة المعاينة.

ليس الأمر أن ذلك يؤثر على النتيجة النهائية, في الحقيقه عقدة المعاينة وجودها كعدمها في هذه النقطة, هي فقط تساعدك لرؤية كيف تبدو النتيجه, وان نظرنا الى الكود الخاص بها في وثائق يونِتي الرسمية تجدها هكذا.

void Unity_Preview_float4(float4 In, out float4 Out){
    Out = In;
    }

لذا فعليا كل ما تقوم به هو إخراج كل شيء يدخل لها بدون اي تلاعب او تغيير في قيمته.

الان وبعد ان اتضحت هذه النقطة تقوم بتوصيل ناتج عقدة واحد ناقص بمخرج الشفافية – Alpha في الشيدر, ويمكنك حذف متغير نسيج التدريج والعقد الخاصة به لعدم الحاجة إليهم مجددا هذه المرة.

التحكم بالتدريج بشكل أفضل

في العادة عندما تريد التحكم بالتدرج وما شابهه فذلك من خلال بعض العمليات الرياضية مثل الضرب, والجمع, الخ.

لكن هناك طريقه اسهل وابسط يمكن استعمالها لهذا الغرض وهي عقدة التدرج – Gradient, وعينة التدرج Sample Gradient, وان جربت وقمت باضافتهم وتوصيل مخرج الاولي بالثانيه في مدخل التدريج, ومن ثم التلاعب في قيمة مدخل الزمن – Time تلاحظ ان عقدة التدريج نفسها تحتوي تدريجا من الابيض للاسود.

بالتالي عندما تغير قيمة الزمن فيها فإنه يختار قيمة واحدة من عقدة التدريج ليقوم بإخراجها, أي أنه لا يخرج تدريجا كاملا.

فعند تعيين الزمن للصفر، الناتج يكون القيمة التي في أقصى يسار عقدة التدريج, بينما عند تعيين قيمة الزمن إلى الواحد الصحيح يكون الناتج هو قيمة أقصى يمين عقدة التدريج.

والزمن هنا لا يعني الوقت ولا عقده الزمن المتوفره ولكي تفهم الامر بشكل اوضح عليك تجربتها او كما جربتها انا هنا.

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

ان كان هذا يريحك فلا مشكلة به ويمكنك فعل هذا, ولكن بالنسبة لي فأفضل العمل مع التدريج من اليسار لليمين, لهذا سأوصل مخرج الـ G مباشرة بمدخل الزمن, ومع ذلك اريد منك تجربة توصيل مخرج الـ One Minus اولا لتري الفرق بنفسك.

بعد ذلك وصل مخرج عقدة عينة التدرج Sample Gradient بمخرج الشفافية للشيدر, والان تقدر بسهولة أن تتحكم في مدى تلاشي النيران تبعا لارتفاعها بالتلاعب في عقدة التدريج. وهكذا تكون انتهت خطوة التدريج الخاصه بمدي تلاشي النيران.

تحسين نمط النيران

نمط النيران تتحرك يبدو متكررا بشكل ملحوظ, وربما مزعج, اذا فكيف يمكن حل مثل هذه المشكلة؟ ببساطة باضافة تشويش اخر يتحرك ايضا بدوره, بالإضافة لتكوينه جزءا من طريقة التلاشي.

والتشويش الذي اخترته لهذا هو التدريجي – Gradient Noise, ثم اضف الحركة له بنفس طريقة اضافتها للفورونوي, عن طريق عقدة الزمن وضربها في متغير اضفته من نوع متجه ثنائي – Vector 2 ليعبر عن سرعة حركة التشويش وقيمته الافتراضية ( 0.4- , 0 )، ثم توصيل الناتج في مدخل الإزاحة.

بعدها وصل ناتج عقدة التكرار والإزاحة في مدخل اليوفي الخاص بعقدة التشويش التدريجي, ومن ثم ستحتاج متغيرا آخر ليتحكم بحجم التشويش لهذا قمت بعمل واحد من نوع رقم عشري – Float مع جعل قيمته الافتراضية بـ 5.

ثم اضرب ناتج عقدة التشويش التدريجي مع ناتج عكس عقدة الفورونوي, ولكن هناك شيء عليك أن تنتبه له.

عند ضربك لشيئين أو قيمتين هناك احتمال أن ينتج رقم أكبر من 1 أو اقل من 0 ولكن لا نريد شيئا كهذا, لذا تحتاج لاضافة عقدة التشبع – Saturate التي تضع حدود للقيم بألا تزيد عن 1 او تقل عن 0, ومن ثم وصل ناتج الضرب بها, وفي النهاية توصل كل هذا بمخرج حد قطع الشفافية – Alpha Clip Threshold للشيدر.

وقمت باضافة متغيرين من نوع متجه ثنائي ليتحكما في قيم التكرار الخاصة بالتشويش التدريجي و فورونوي, مع جعل قيمهم الافتراضية (1,1), ثم توصيلهم في مداخل التكرار – Tiling بعقدة التكرار والازاحة.

اضافة الالوان 

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

 ويمكنك اما العمل به ايضا, او بعمل تدريج جديد بإحدى الطرق التي تم ذكرها, ولهذا انشئت متغيرين من نوع اللون مع جعل لونهم الافتراضي ابيض وتغيير نوعهم لـ HDR.

بعد ذلك لتطبيق التدريج علي الالوان يمكنك استعمال عقدة الاستيفاء الخطي – Lerp, ومن ثم توصيل ناتج التدريج في مدخل الـ T, وبعدها توصيل اللون الاول مع B, واللون الثاني مع A. وتوصيل هذا في النهاية بمخرج اللون – Base Color للشيدر.

وبعد ذلك يمكنك حفظ الشيدر أخيرا ومن ثم اضافتة لخامة – Material, واضافته للمشهد على شكل المربع – Quad على سبيل المثال, والان يمكنك تجربة تغيير ألوانه كما تشاء.

ولكن هناك شيء اريد اضافته, وهو أمكانية تقيد هذه النيران بشكل محدد بدلا من هذا المربع, ويمكنك ذلك عن طريق اضافة نسيج مخصص علي الشكل الذي تريده.

 بعمل متغير من نوع نسيج ثنائي الأبعاد – Texture 2D وتوصيله مع عقدة Sample Texture 2D, ومن ثم ضربه مع ناتج عقدة Sample Gradient, وإعادة توصيله في مخرج الشفافية للشيدر, ولا تنس إضافة عقدة التشبع.

ويمكنك ان تلاحظ اني قمت بالتعديل قليلا علي عقدة التدريج.

وبهذا يمكنك الحفظ لاخر مره والخروج للمشهد لترى النتيجة.

وبهذا اخيرا تكون قد انتهيت من هذا الشيدر الملتهب, والذي لم تتعلم فقط طريقة عمله, بل عرفت ايضا وظائف بعض العقد الاضافية.

وإذا كنت تريد الاستفادة أكثر يمكنك تجربة أكثر من شيء من الخيارات التي وجدتها اثناء هذا الشيدر, مثل تغيير التدريج, التلاعب بالسرعه او الحجم, بحيث يزيد فهمك اكثر عنه.

وان كان لديك سؤال فيه, أو حتى اقتراح لشيء تريد رؤيته يمكنك ايصاله لنا من خلال التعليقات, ومنها يمكنك ارسال رأيك لنا ايضا.

1 1 vote
Article Rating
Subscribe
نبّهني عن
guest

0 تعليقات
Oldest
Newest Most Voted
Inline Feedbacks
View all comments