هذه المقالة هي الجزء الثاني من سلسلة H - Immersion . يمكن قراءة الجزء الأول هنا: الغمر في الغمر .عند إنشاء رسم متحرك بحجم 64 كيلوبايت فقط ، يكون من الصعب استخدام صور جاهزة. لا يمكننا تخزينها بالطريقة التقليدية ، لأنها ليست فعالة بما فيه الكفاية ، حتى إذا قمت بتطبيق الضغط ، على سبيل المثال JPEG. الحل البديل هو التوليد الإجرائي ، أي كتابة التعليمات البرمجية التي تصف إنشاء الصور أثناء تنفيذ البرنامج. كان تطبيقنا لهذا الحل عبارة عن مولد نسيج - وهو جزء أساسي من سلسلة أدواتنا. في هذا المنشور سنشرح كيف قمنا بتطويره واستخدامه في
H - الغمر .
تضيء الأضواء الكاشفة تحت سطح البحر تفاصيل قاع البحر.الإصدار المبكر
كان إنشاء الملمس أحد العناصر الأولى لقاعدة الكود لدينا: تم استخدام القوام الإجرائي بالفعل في مقدمة
B - Incubation الأولى.
يتكون الكود من مجموعة من الوظائف التي تملأ ، ترشح ، وتحول ، وتدمج القوام ، بالإضافة إلى حلقة واحدة كبيرة تتخطى جميع القوام. تمت كتابة هذه الوظائف في C ++ النقي ، ولكن تمت إضافة تفاعل C API لاحقًا حتى يمكن تقييمها بواسطة مترجم C
PicoC . في ذلك الوقت ، استخدمنا PicoC لتقليل الوقت الذي تستغرقه كل عملية تكرار: وبهذه الطريقة تمكنا من تغيير وإعادة تحميل القوام أثناء تنفيذ البرنامج. كان التبديل إلى المجموعة الفرعية C تضحية صغيرة مقارنة بحقيقة أنه يمكننا الآن تغيير الرمز ورؤية النتيجة على الفور ، دون الحاجة إلى الإغلاق وإعادة تجميع وإعادة تحميل العرض التوضيحي بأكمله.
باستخدام نمط بسيط وقليل من الضوضاء والتشوه ، يمكننا الحصول على نسيج خشبي منمق.في هذا المشهد من ورشة F - فيليكس
تم استخدام مواد خشبية مختلفة.لبعض الوقت ، اكتشفنا إمكانات هذا المولد ، ونتيجة لذلك نشرناه على خادم ويب مع نص PHP صغير وواجهة ويب بسيطة. يمكننا كتابة رمز النسيج في حقل النص ، ونقله البرنامج النصي إلى المولد ، ثم أفرغ النتيجة كملف PNG لعرضه على الصفحة. في وقت قريب جدًا ، بدأنا في الرسم مباشرةً في العمل أثناء استراحة الغداء ومشاركة روائعنا الصغيرة مع أعضاء آخرين في المجموعة. هذا التفاعل دفعنا إلى العملية الإبداعية.
معرض الويب لمولد نسيجنا القديم. يمكن تحرير جميع القوام في المتصفح.إعادة تصميم كاملة
لفترة طويلة ، ظل مولد النسيج دون تغيير تقريبًا ؛ اعتقدنا أنها كانت جيدة ، وتوقفت فعاليتنا عن الزيادة. ولكن بمجرد أن اكتشفنا أن هناك الكثير من
الفنانين في منتديات الإنترنت يظهرون أنسجتهم التي تم إنشاؤها بشكل إجرائي بالكامل ، بالإضافة إلى ترتيب
التحديات في مواضيع مختلفة. كان المحتوى الإجرائي سمة من سمات المشهد التجريبي ، ولكن
Allegorithmic و
ShaderToy والأدوات المماثلة جعلته متاحًا لعامة الناس. لم ننتبه لهذا الأمر ، وبدأوا يضعوننا بسهولة على شفرات الكتف. غير مقبول!
الأريكة النسيج . نسيج نسيج إجرائي بالكامل تم إنشاؤه في Substance Designer. تم النشر بواسطة: إيمانول دلغادو. www.artstation.com/imanoldelgadoأرضية الغابة . نسيج تربة الغابات إجرائي بالكامل تم إنشاؤه بواسطة Substance Designer. نشره دانيال ثيجر. www.artstation.com/deteلقد احتجنا منذ فترة طويلة إلى إعادة التفكير في أدواتنا. لحسن الحظ ، سمحت لنا سنوات عديدة من العمل مع نفس مولد النسيج بالتعرف على عيوبه. بالإضافة إلى ذلك ، أخبرنا مولد الشبكة الوليدة أيضًا كيف يجب أن يبدو خط المحتوى الإجرائي.
كان أهم خطأ معماري هو تنفيذ التوليد كمجموعة من العمليات بأشياء نسيجية. من وجهة نظر عالية المستوى ، قد يكون هذا هو النهج الصحيح ، ولكن من وجهة نظر التنفيذ ، فإن وظائف مثل
الملمس. DoSomething () أو
Combine (الملمس ، الملمس) لها عيوب خطيرة.
أولاً ، يتطلب أسلوب OOP الإعلان عن هذه الوظائف كجزء من واجهة برمجة التطبيقات ، بغض النظر عن مدى بساطتها. هذه مشكلة خطيرة لأنها لا تتطور بشكل جيد ، والأهم من ذلك ، تخلق احتكاك غير ضروري في العملية الإبداعية. لم نرغب في تغيير واجهة برمجة التطبيقات في كل مرة نحتاج فيها إلى تجربة شيء جديد. هذا يعقد التجارب ويحد من الحرية الإبداعية.
ثانيًا ، من حيث الأداء ، يتطلب منك هذا النهج معالجة بيانات النسيج في دورات عدة مرات كما هو الحال مع العمليات. لن يكون هذا مهمًا بشكل خاص إذا كانت هذه العمليات مكلفة فيما يتعلق بتكلفة الوصول إلى أجزاء كبيرة من الذاكرة ، ولكن هذا ليس كذلك في العادة. باستثناء جزء صغير جدًا من العمليات ، على سبيل المثال ، توليد
ضوضاء أو
تعبئة Perlin ، فهي في الأساس بسيطة للغاية ولا تتطلب سوى بعض التعليمات حول نقطة النسيج. أي أننا تحايلنا على بيانات النسيج لإجراء عمليات تافهة ، وهي غير فعالة للغاية من وجهة التخزين المؤقت.
يحل الهيكل الجديد هذه المشاكل من خلال إعادة تنظيم المنطق. تؤدي معظم الوظائف في الممارسة بشكل مستقل نفس العملية لكل عنصر نسيج. لذلك ، بدلاً من كتابة
نسيج ، وظيفة
DoSomething () التي تتجاوز جميع العناصر ، يمكننا كتابة النسيج.
ApplyFunction (f) ، حيث يعمل
f (element) فقط لعنصر نسيج واحد. ثم يمكن كتابة
f (العنصر) وفقًا لنسيج معين.
هذا يبدو وكأنه تغيير طفيف. ومع ذلك ، فإن هذه البنية تبسط واجهة برمجة التطبيقات ، وتجعل رمز التوليد أكثر مرونة وتعبيرًا ، وأكثر ملاءمة لذاكرة التخزين المؤقت ، ويسمح بمعالجة متوازية بسهولة. لقد أدرك العديد من القراء بالفعل أن هذا في الأساس عبارة عن تظليل. ومع ذلك ، يظل التنفيذ الفعلي هو رمز C ++ الذي تم تنفيذه على المعالج. ما زلنا نحتفظ بالقدرة على تنفيذ العمليات خارج الحلقة ، ولكن لا نستخدم هذا الخيار إلا عند الضرورة ، على سبيل المثال ، عن طريق الالتفاف.
كان:
أصبح:
موازاة
يستغرق إنشاء النسيج وقتًا ، والمرشح الواضح لتقليل هذا الوقت هو تنفيذ الكود الموازي. على الأقل ، يمكنك تعلم كيفية إنشاء مواد متعددة في وقت واحد. هذا هو بالضبط ما فعلناه
لورشة F - Felix ، وهذا يقلل بشكل كبير من وقت التحميل.
ومع ذلك ، هذا لا يوفر الوقت حيث تشتد الحاجة إليه. لا يزال إنشاء نسيج واحد يستغرق وقتًا طويلاً. ينطبق هذا على التغيير حيث نواصل إعادة تحميل النسيج مرارًا وتكرارًا قبل كل تعديل. بدلاً من ذلك ، من الأفضل موازاة كود توليد النسيج الداخلي. نظرًا لأن الشفرة تتكون حاليًا من وظيفة كبيرة واحدة يتم تطبيقها في حلقة على كل مقطع ، يصبح التوازي بسيطًا وفعالًا. يقلل من تكلفة التجارب والضبط والمسودات ، مما يؤثر بشكل مباشر على العملية الإبداعية.
توضيح لفكرة قمنا باستكشافها والتخلص منها من أجل H - الغمر : زخرفة من الفسيفساء مع بطانة orichalcon. هنا يظهر في أداة التحرير التفاعلية لدينا.جيل الجانب GPU
إذا كان هذا لا يزال غير واضح ، فسأقول أن توليد النسيج يتم تنفيذه بالكامل في وحدة المعالجة المركزية. ربما يقرأ البعض منكم هذه السطور وهم في حيرة من أمرهم "لكن لماذا ؟!". يبدو أن الخطوة الواضحة هي توليد النسيج في معالج الفيديو. بادئ ذي بدء ، سيزيد معدل التوليد بترتيب من الحجم. فلماذا لا نستخدمها؟
السبب الرئيسي هو أن هدف إعادة تصميمنا الصغير هو البقاء على وحدة المعالجة المركزية. التبديل إلى وحدة معالجة الرسوم (GPU) يعني المزيد من العمل. سيتعين علينا حل المشكلات الإضافية التي ما زلنا لا نملك الخبرة الكافية بشأنها. من خلال العمل مع وحدة المعالجة المركزية ، لدينا فهم واضح لما نريد ، ونعرف كيفية إصلاح الأخطاء السابقة.
ومع ذلك ، فإن الخبر السار هو أنه بفضل الهيكل الجديد ، تبدو تجربة GPU الآن تافهة جدًا. ستكون مجموعات الاختبار من كلا النوعين من المعالجات تجربة مثيرة للاهتمام للمستقبل.
توليد الملمس والتظليل الدقيق جسديًا
كان القيد الآخر للتصميم القديم هو اعتبار النسيج كصورة RGB فقط. إذا احتجنا إلى توليد مزيد من المعلومات ، فلنفترض أن المادة المنتشرة ونسيج المعايير الطبيعية على نفس السطح ، فلن يمنعنا شيء من فعل ذلك ، لكن واجهة برمجة التطبيقات لم تساعد كثيرًا. أصبح هذا مهمًا بشكل خاص في سياق التظليل المادي (PBR).
في خط الأنابيب التقليدي بدون PBR ، عادة ما يتم استخدام مواد ملونة ، حيث يتم خبز الكثير من المعلومات. غالبًا ما تمثل هذه القوام المظهر النهائي للسطح: لديهم بالفعل حجم معين ، والشقوق مظلمة ، وقد تكون هناك انعكاسات عليها. إذا تم استخدام عدة مواد في نفس الوقت ، فعادةً ما يتم دمج التفاصيل الكبيرة والصغيرة الحجم لإضافة خرائط عادية أو انعكاس سطحي.
تستخدم ناقلات PBR لجهاز Surface عادةً مجموعات نسيج متعددة تمثل القيم المادية بدلاً من النتيجة الفنية المرغوبة. عادة ما يكون نسيج اللون المنتشر ، الأقرب إلى ما يسمى غالبًا "لون" السطح ، مسطحًا وغير مثير للاهتمام. يتم تحديد براق اللون بواسطة مؤشر الانكسار للسطح. معظم التفاصيل والتنوع مأخوذان من نسيج المعتاد والخشونة (الخشونة) (التي يمكن أن يعتبرها الشخص نفسه ، ولكن بمقياسين مختلفين). تصبح الانعكاسية المدركة للسطح نتيجة لمستوى الخشونة. في هذه المرحلة ، سيكون من المنطقي التفكير من حيث المواد وليس المواد.
يسمح لنا الهيكل الجديد بالإعلان عن تنسيقات البكسل العشوائية للقوام. بعد أن جعلتها جزءًا من واجهة برمجة التطبيقات ، نسمح لها بالتعامل مع جميع التعليمات البرمجية المعيارية. بعد الإعلان عن تنسيق البكسل ، يمكننا التركيز على شفرة تصميم الإعلان دون بذل جهد كبير في معالجة هذه البيانات. في وقت التشغيل ، ستقوم بإنشاء العديد من القوام ونقلها بشفافية إلى وحدة معالجة الرسومات.
في بعض خطوط أنابيب PBR ، لا تنتقل الألوان المنتشرة والأرضية بشكل مباشر. بدلاً من ذلك ، يتم استخدام معلمات "اللون الأساسي" و "المعدن" ، والتي لها مزاياها وعيوبها. في
H - الغمر ، نستخدم النموذج المنتشر + المرآوي ، وتتكون المادة عادة من خمس طبقات:
- لون منتشر (RGB ؛ 0: Vantablack ؛ 1: ثلج طازج ).
- لون معين (RGB: جزء من الضوء ينعكس عند 90 درجة ، والمعروف أيضًا باسم F0 أو R0 ).
- الخشونة (أ ؛ 0: سلس تمامًا ؛ 1: يشبه المطاط).
- عادي (XYZ ؛ متجه الوحدة).
- ارتفاع التضاريس (A ؛ يستخدم لرسم خرائط انسداد المنظر).
عند استخدامها ، تمت إضافة معلومات انبعاث الضوء مباشرة إلى جهاز تظليل. لم نجد أنه من الضروري أن يكون هناك انسداد محيط ، لأنه في معظم المشاهد لا توجد إضاءة محيطة على الإطلاق. ومع ذلك ، لن أتفاجأ بأنه سيكون لدينا طبقات إضافية أو أنواع أخرى من المعلومات ، على سبيل المثال ، التباين أو التعتيم.
تُظهر الصور أعلاه تجربة حديثة مع توليد انسداد محيط محلي بناءً على الارتفاع. لكل اتجاه ، نمر عبر مسافة محددة مسبقًا ونحافظ على أكبر منحدر (فرق الارتفاع مقسومًا على المسافة). ثم نحسب الإطباق من المنحدر المتوسط.
القيود والعمل المستقبلي
كما ترون ، أصبح الهيكل الجديد تحسنًا كبيرًا عن الهيكل القديم. بالإضافة إلى ذلك ، فهي تشجع التعبير الإبداعي. ومع ذلك ، لا تزال لديها قيود نريد إزالتها في المستقبل.
على سبيل المثال ، على الرغم من عدم وجود مشاكل في هذه المقدمة ، لاحظنا أن تخصيص الذاكرة يمكن أن يكون عقبة. عند إنشاء مواد ، يتم استخدام صفيف واحد من القيم العائمة. مع الزخارف الكبيرة مع العديد من الطبقات ، يمكنك أن تواجه بسرعة مشكلة في تخصيص الذاكرة. هناك طرق مختلفة لحلها ، ولكن جميعها لها عيوبها. على سبيل المثال ، يمكننا إنشاء تجانب نسيج تجانب ، في حين أن قابلية التوسع ستكون أفضل ، ومع ذلك ، يصبح تنفيذ بعض العمليات ، مثل الالتفاف ، أقل وضوحًا.
بالإضافة إلى ذلك ، في هذه المقالة ، على الرغم من كلمة "المواد" المستخدمة ، تحدثنا فقط عن القوام ، ولكن ليس عن التظليل. ومع ذلك ، يجب أن يؤدي استخدام المواد أيضًا إلى التظليل. يعكس هذا التناقض حدود الهيكل الحالي: إن توليد النسيج والتظليل جزءان منفصلان يفصل بينهما جسر. حاولنا تسهيل عبور هذا الجسر ، لكن في الحقيقة نريد أن تصبح هذه الأجزاء واحدة. على سبيل المثال ، إذا كانت المادة تحتوي على معلمات ثابتة وديناميكية ، فسنريد وصفها في مكان واحد. هذا موضوع معقد ولا نعرف حتى الآن ما إذا كان هناك حل جيد ، ولكن دعونا لا نتقدم على أنفسنا.
تجربة لإنشاء نسيج نسيج مشابه لعمل Imadol Delgado الموضح أعلاه.