كيفية نقل تظليل من محرك اللعبة إلى Substance Painter

اسمي تاراس أوليسكي ، أنا فنان تقني في بلاريوم خاركيف. لتحسين الرسومات من Survival RPG على الأجهزة المحمولة ، استخدمنا أجهزة تظليل مخصصة. أنها تنطوي على استخدام مواد وخرائط فريدة لا تشبه الأنسجة والخرائط في طرق التظليل الشائعة الأخرى. ونتيجة لذلك ، ليس من الواضح تمامًا للفنانين ثلاثي الأبعاد كيفية إنشاء هذه الأنسجة للأصول في اللعبة. لترى على الفور كيف سيبدو النموذج ثلاثي الأبعاد في محرك اللعبة في مرحلة التركيب ، قمت بنقل التظليل إلى Substance Painter. عمليا لا توجد مواد API في Substance Painter في الوقت الحالي ، درست هذا الموضوع بنفسي ، لذلك قررت مشاركة أفكاري الخاصة.



تظليل الوحدة


تستخدم اللعبة تظليل matcap. بالإضافة إلى النسيج المعتاد المعتاد ، يتم أيضًا نقل زخارف Matcap التي تم إنشاؤها مسبقًا إلى تظليل. يتم استيفائها وتمويهها باستخدام قناعين ، على التوالي. ونتيجة لذلك ، يتم ضرب نسيج Matcap في الوهج المنتشر والمزيف ويمكن رؤية الانعكاسات على المواد.



يوضح المثال أدناه كيفية تنفيذ Matcap في رسم بياني تظليل. في هذه الحالة ، يتم تعبئة زخارف Matcap في واحد وتقسيمها إلى قنوات. أي المعادن وغير المعدنية في القناتين R و G ، على التوالي.



تم استيفاء اثنين من Matcaps كمثال من قبل المدقق.



والنتيجة هي تشابه معين مع المعدن وغير المعدني كما هو الحال في تظليل PBR.

أردنا إضافة الخشونة والأوساخ إلى المواد ، لخلق نوع من الخشونة التناظرية في تظليل PBR. للقيام بذلك ، استخدمنا طريقة التركيب.رسم خرائط mip . يؤدي تسلسل القوام إلى إنشاء ما يسمى هرم MIP بدقة تصل إلى 1x1 كحد أقصى. على سبيل المثال: 1 × 1 ، 2 × 2 ، 4 × 4 ، 8 × 8 ، 16 × 16 ، 32 × 32 ، 64 × 64 ، 128 × 128. ويطلق على كل من هذه الأنسجة مستوى MIP. لتطبيق الجرجرة في تظليل بكسل بواسطة بكسل ، بناءً على القناع ، تحتاج إلى تحديد مستوى MIP المطلوب. اتضح بهذه الطريقة: عندما تكون البكسل على القناع سوداء ، يتم تحديد الحد الأقصى لمستوى MIP على Matcap ، وحيث يكون لون البكسل أبيض ، يكون مستوى MIP هو 0.





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



إنشاء مادة الرسام لخلق تظليل


جميع تظليل المتاحة في Substance Painter مكتوبة في GLSL.
على وجه التحديد ، لكتابة تظليل ل Substance Painter ، أستخدم رمز VS المجاني. لتمييز بناء الجملة ، من الأفضل استخدام دعم لغات Shader لملحق VS Code.



هناك القليل جدًا من المواد حول API في Substance Painter ، لذا فإن الوثائق القياسية الموجودة في Help / Documentation / Shader API لا تقدر بثمن.



الشيء الثاني الذي سيساعد في كتابة التظليل هو التظليل القياسي في Substance Painter. للعثور عليهم ، انتقل إلى ... / Allegorithmic / SubstancePainter / resources / shelf /legorithmic / shaders.

دعنا نحاول كتابة أبسط تظليل مضاء سيظهر اللون الأساسي. أولاً ، قم بإنشاء ملف نصي بامتداد .glsl وكتابة مثل هذا التظليل البسيط. ربما ، بينما لا يوجد شيء واضح ، سأخبر بمزيد من التفصيل عن هيكل تظليل في Substance Painter.



قم بإنشاء مشروع جديد واسحب التظليل إلى الصدفة. في القائمة المنسدلة استيراد مواردك إلى ، حدد المشروع "اسم_المشروع" .



هذا ضروري حتى يمكن تحديث جميع التغييرات.

الآن انتقل إلى Window / Views / Shader Settings وحدد Shader الجديد الخاص بك في النافذة التي تظهر. يمكنك استخدام البحث.



إذا رأيت أن النموذج بأكمله أبيض ويمكنك رسم لون أساسي عليه ، فأنت فعلت كل شيء بشكل صحيح. الآن يمكنك حفظ المشروع والانتقال إلى القسم التالي.



إذا كان النموذج باللون الوردي ، فمن المرجح أن يكون هناك خطأ في التظليل - سيكون إشعارًا بذلك في وحدة التحكم.

بناء تظليل في رسام المواد


ضع في اعتبارك بنية تظليل باستخدام تظليل غير موصوف سابقًا كمثال.



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

ينشئ الخطان 3 و 4 معلمة ومتغيرًا ، على التوالي. تربط المعلمة قناة اللون الأساسية مع المتغير الذي سيتم تخزين النسيج المطلي فيه. يتم توضيح جميع المعلمات في المساعدة ، في حالة اللون الأساسي يجب توضيح كل شيء كما في المثال. يحدد الخط 8 الملمس في إحداثيات الأشعة فوق البنفسجية للنموذج ثلاثي الأبعاد. ألاحظ أنه بالنسبة للنسيج ذو اللون الأساسي ، يتم استخدام نظام Sparse Virtual Textures ، لأن المكتبة متصلة بالسطر الأولlib-sparce.glsl .

يمكنك العثور على العديد من تطبيقات Matcap ، ولكن نقطته الرئيسية هي أن المعايير النموذجية موجهة نحو الكاميرا ويتم تدوير النسيج على طول محوري x و y. لتدوير الوضع الطبيعي نحو الكاميرا ، نحتاج إلى مصفوفة عرض ، أو نوع مصفوفة . يمكنك العثور على واحد في الشهادة المذكورة أعلاه.



إذن ، هذه هي الأسماء المعلنة نفسها كما في حالة اللون الأساسي. الآن نحن بحاجة إلى الحصول على المعايير الطبيعية للنموذج ثلاثي الأبعاد.


مطلوب صفر كعنصر رابع من ناقلات.

يؤدي ضرب مصفوفة عرض مع ناقل عادي إلى توسيع الوضع العادي إلى الكاميرا.



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

الآن يمكنك إنشاء إحداثيات للأشعة فوق البنفسجية من viewNormal .



حان الوقت لربط نسيج matcap.



في هذه الحالة ، ستنشئ المعلمة حقل نسيج في واجهة التظليل ، وإذا كان المشروع يحتوي على نسيج باسم "Matcap_mip" ، فإن Substance Painter سيسحبه تلقائيًا.



دعونا نتحقق مما حدث.



هنا يتم توسيع نسيج Matcap في إحداثيات جديدة ومضاعفة بلون أساسي عند الإخراج. أريد الانتباه إلى حقيقة أن نسيج Matcap يتم توسيعه من خلال وظيفة النسيج () ، واللون الأساسي - من خلال وظيفة النسيج () . وذلك لأن الأنسجة المحددة من خلال واجهة التظليل لا يمكن أن تكون من نوع SamplerSparse .

يجب أن تبدو النتيجة شيء مثل هذا:



الآن أضف قناعًا سيخلط اثنين من مات كاب. للراحة ، أضف اثنين من ماتكابا في نسيج واحد ، وكسرهما إلى قنوات. ونتيجة لذلك ، سيكون هناك زخارف Matcap في القناتين R و G ، على التوالي.

سيظهر شيء مثل هذا:



لنبدأ في إضافة قناع إلى تظليل. المبدأ مشابه لإضافة اللون الأساسي.



يكفي استبدال قيمة الأساس مع user0 في المعلمة.

الآن احصل على قيمة القناع في تظليل البكسل وامزج مواد matcap.



هنا ، يتم استخدام قناة R فقط في القناع ، لأنها ستكون بالأبيض والأسود. يتم خلط قناتي matcap باستخدام وظيفة mix () ، وهي تناظرية من lerp في Unity.

دعونا نقوم بتحديث التظليل وإضافة قنوات مخصصة في الواجهة. للقيام بذلك ، انتقل إلى Window / Views / Texture Set Settings، في النافذة بالقرب من عنوان القنوات ، انقر فوق علامة الجمع وحدد user0 من القائمة الكبيرة.



يمكن استدعاء القناة أي شيء يعجبك.

الآن ، بالاعتماد على هذه القناة ، يمكنك أن ترى كيف يتم خلط قوام Matcap.



استخدم Shader for Unity أيضًا خرائط عادية لـ Matcap ، والتي تم خبزها من نموذج عالي بولي. دعونا نحاول أن نفعل نفس الشيء في Substance Painter.

لاستخدام جميع العمليات على العاديات ، تحتاج إلى توصيل المكتبة المناسبة :



الآن نقوم بتوصيل الخرائط العادية. هناك اثنان منهم في Substance Painter: يتم الحصول على واحد عن طريق الخبز ، والثاني يمكن رسمه.



وفقًا للمعلمات ، يمكنك تخمين أن channel_normal هي خريطة عادية ، والتي يمكنك من خلالها رسم ، و text_normal- خريطة طبيعية مخبوزة. وألاحظ أيضًا أن اسم المتغير الملمس_normal مضمن في واجهة برمجة التطبيقات ولا يمكنك تسميته حسب تقديرك .

بعد ذلك ، قم بفك البطاقات في تظليل البكسل:



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



أولاً نقوم بخلط الخريطتين العاديتين ، ثم المعتاد العادي. على الرغم من أنه لا يهم حقاً من أجل خلطها.

سيبدو دوران المعتاد في اتجاه نظرة الكاميرا على النحو التالي:



ثم لا يمكنك تغيير أي شيء ، سيظل كل شيء كما هو. يجب أن يكون شيء من هذا القبيل:



رسم خرائط Mip ، كما هو مذكور أعلاه ، مطلوب في هذه الحالة لمحاكاة الجرجرة ، شيء مثل بطاقة خشونة في تظليل PBR. لكن المشكلة الرئيسية هي أن الهرم من بطاقات mip لم يتم إنشاؤه للنسيج ، والذي يتم نقله من واجهة التظليل ، وبالتالي لن تعمل طريقة نسيجية () من glsl. يمكن للمرء أن يذهب في الاتجاه الآخر وتحميل نسيج Matcap من خلال قناة المستخدم ، كما حدث لخلط Matcap. ولكن بعد ذلك ستنخفض جودة النسيج بشكل كبير وستظهر التحف الغريبة.

الحل البديل هو إنشاء هرم من بطاقات MIPيدويًا ، في Adobe Photoshop أو محرر آخر مشابه ، ثم حدد مستوى MIP. الهرم مبني بكل بساطة. من الضروري المتابعة من حجم النسيج الأصلي - في حالتي هو 256x256. ننشئ ملفًا بحجم 384x256 (384 ، لأن 256 + 256/2) ونقلل الآن البنية الأصلية إلى النصف حتى يصل حجمها إلى بكسل واحد. يتم وضع جميع إصدارات الأنسجة المخففة على يمين الملمس الأصلي بترتيب تصاعدي. يجب أن يتحول الأمر إلى ما يلي:



الآن يمكنك البدء في كتابة دالة ستعثر على إحداثيات كل نسيج في الهرم اعتمادًا على لون كل بكسل على القناع.

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



الآن احسب الأشعة فوق البنفسجية للنسيج الأصلي ، أي اقتصاص تلك 128 بكسل الإضافية في العرض. للقيام بذلك ، اضرب إحداثيات س في ⅔.



لاستخدام باقي النسيج من الهرم ، تحتاج إلى البحث عن الأنماط. عندما أنشأنا الهرم من القوام ، يمكننا أن نلاحظ أنه في كل مرة يتم تقليل المادة بمقدار النصف عن الحجم السابق. بمعنى ، كم مرة ينخفض ​​حجم النسيج ، يمكنك تحديده برفع 2 إلى قوة مستوى MIP .



اتضح ، إذا حددت المستوى ، على سبيل المثال ، 4 ، فسوف ينخفض ​​النسيج بمقدار 16 مرة. مثليتم تحديد إحداثيات الأشعة فوق البنفسجية من 0 إلى 1 ، ثم يجب تطبيع الحجم ، أي 1 مقسومًا على عدد المرات التي انخفض فيها النسيج ، على سبيل المثال ، 1 مقسومًا على 16.

باستخدام القيمة التي تم الحصول عليها من متغير الحجم ، يمكنك حساب الإحداثيات لمستوى MIP معين . يتم تقليل



حجم الأشعة فوق البنفسجية بنفس طريقة حجم النسيج. عند إحداثيات x ، يتغير النسيج دائمًا بمقدار ⅔. يمكن تعريف التحول الإحداثي y على أنه مجموع جميع قيم متغير الحجم لكل قيمة مستوى . بمعنى ، إذا كانت القيمة = 1 ، فستتغير الأشعة فوق البنفسجية في إحداثيات y بمقدار 0 بكسل ، وإذا كان المستوى = 2 ، فسيكون التحول نصف ارتفاع النسيج - 128 بكسل. إذا كان المستوى = 3، ثم تحول التحول إلى 128 + 64 بكسل وما إلى ذلك. يمكن الحصول على مجموع جميع التحولات باستخدام الدورة.



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



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





لتحديد مستوى MIP كنسيج ، ما عليك سوى ضرب طول المصفوفة في النسيج. يمكنك الآن توصيل إحداثيات الأشعة فوق البنفسجية الجديدة من خلال الطريقة المكتوبة للتو.



لا تنس أن تترجم النسيج إلى نوع int ، لأن هذا هو الآن فهرس للصفيف.
بعد ذلك ، تحتاج إلى إضافة قناة مخصصة في Substance Painter ، كما فعلنا من قبل. يجب أن يتحول





على النحو التالي : الشيء الوحيد المفقود للتظليل هو مصدر الضوء والقدرة على تدويره عن طريق الضغط على التحول. بادئ ذي بدء ، لهذا نحن بحاجة إلى معلمة تنتج زاوية الدوران بالضغط على التحول ، ومصفوفة الدوران .





نضع مصدر الضوء بشكل عشوائي ونضرب الموضع في مصفوفة الدوران.



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



سيتم تعيين لون الظل ولون مصدر الضوء من خلال المعلمات:



يتم استيفاء معلمات اللون وفقًا للإضاءة المحسوبة أعلاه.



سوف يتحول على



النحو التالي : باستخدام هذه المعلمات ، يمكنك ضبط لون الظل ولون مصدر الضوء من خلال واجهة Substance Painter.



قم بإنشاء وتكوين إعداد مسبق


عندما يكون التظليل جاهزًا ، تحتاج إلى استيراد نسيج Matcap والتظليل مع إعداد الرف.



نقوم بإزالة جميع القنوات غير المستخدمة وإضافة قنوات المستخدم:



سيبدو الإعداد المسبق لتصدير الأنسجة مثل أي قنوات أخرى ، باستثناء أنه سيستخدم قنواتنا المخصصة.



سننشئ نموذجًا لجميع الإعدادات بحيث يتم تعيين جهاز التظليل المطلوب على الفور عند إنشاء المشروع ويتم تكوين جميع قنوات النسيج. للقيام بذلك ، انتقل إلى File / SaveAsTemplate وقم بحفظ القالب.



الآن عند إنشاء مشروع جديد ، لا تحتاج إلى تكوين أي شيء - ما عليك سوى تحديد النموذج المطلوب.



على ماذا حصلت


يمكن للفنان التقني إنشاء تأثيرات خاصة ، وتخصيص المشاهد ، وتحسين عمليات العرض. أردت أيضًا أن تكون نماذج الدروع والأسلحة في Stormfall: Saga of Survival بالضبط ما قصده الفنانون ثلاثي الأبعاد. نتيجة لذلك ، يبدو النموذج ثلاثي الأبعاد في Substance Painter كما هو الحال في محرك اللعبة.


نموذج ثلاثي الأبعاد في Substance Painter مع تظليل مخصص.


نموذج ثلاثي الأبعاد في Unity مع تظليل مخصص.

آمل أن تكون المقالة مفيدة وألهمتك لإنجازات جديدة!

All Articles