شادر ليست سحرية. تظليل الكتابة في الوحدة. مقدمة

مرحبا بالجميع! اسمي Grigory Dyadichenko ، وأنا مؤسس شركة CTO لشركة Foxsys Studios. اليوم أريد أن أتحدث عن تظليل. تعد القدرة على كتابة تظليل (والعمل عمومًا مع التقديم) مهمة جدًا عند تطوير أنظمة التشغيل المحمولة أو AR / VR ، إذا كنت ترغب في تحقيق رسومات رائعة. العديد من المطورين يعتقدون تظليل السحر. أن هناك القليل من المعلومات الجيدة عنهم ، وأنه من أجل كتابتها ، يجب أن يكون لديك ، كحد أدنى ، لقب مرشح العلم. نعم ، إن تطور التظليل من خلال مبادئهم يختلف تمامًا عن تطوير العميل. ولكن الشيء الرئيسي هو فهم المبادئ الأساسية لتظليل ، وكذلك لمعرفة جوهرها ، بحيث لا يوجد شيء سحري والبحث عن المعلومات حول هذا الموضوع كانت مهمة بسيطة. هذه السلسلة من المقالات مخصصة للمبتدئين ، لذا إذا كنت جيدًا في تظليل البرمجة ، فلن تكون هذه السلسلة ممتعة بالنسبة لك. أي شخص يريد أن يفهم هذا الموضوع - مرحبا بكم تحت الخفض!



هذا مقال تمهيدي سأشرح فيه المبادئ العامة لتظليل الكتابة. إذا كان الموضوع مثيرًا للاهتمام ، فسنحلل بمزيد من التفصيل في مقالات منفصلة: تظليل الرأس ، التظليل الهندسي ، تظليل الشظايا / بكسل ، تظليل المخطط الثلاثي ، تأثيرات مساحة الشاشة وظلال الكمبيوتر (OpenCL ، CUDA ، إلخ). وبشكل عام ، كل السحر الذي يمكن القيام به على GPU. سيتم فرز هذا في سياق خط أنابيب الوحدة القياسي. لذلك LWRP و HDRP حتى الآن تبدو رطبة قليلاً بالنسبة لي.

ما هو تظليل؟



المصدر: www.shadertoy.com/view/MsGSRd

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

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



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

#pragma vertex vert #pragma fragment frag 

حيث نقرر أن الجزء العلوي من التظليل سيتم كتابته في الدالة vert ، والجزء المجزأ في الدالة frag.

تحدد الهياكل التي نصفها في التظليل البيانات التي سنأخذها من الشبكة وبعد المعالجة باستخدام تظليل قمة الرأس المعلقة على كائنات MeshRenderer و MeshFilter.

  struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; UNITY_FOG_COORDS(1) float4 vertex : SV_POSITION; }; 

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

بمزيد من التفصيل ، يتم توضيح جميع الفروق الدقيقة ، وكذلك العديد من الأمثلة في وثائق Unity docs.unity3d.com/Manual/SL-Reference.html

لغات البرمجة شادر



المصدر: www.shadertoy.com/view/WsS3Dc

ما هو المهم ألا ننسى. حقيقة أن تظليل مكتوبة الآن في ثلاث لغات البرمجة التي لا علاقة لها بالوحدة. CG ، GLSL و HLSL. أسهل طريقة لكتابة تظليل في وحدة هي من خلال HLSL ، لأنه حيث تتم كتابة ملفات تظليل مع إذن. shader. وإذا كانت هناك معلومات قليلة نسبيًا عن التظليل في سياق الوحدة ، فإن المعلومات بشكل منفصل عن HLSL و GLSL و CG هي مجرد طن. تصف وثائق التظليل كيفية نقل ما هو مكتوب بهذه اللغات إلى الوحدة. لذلك ، اتضح أن جميع المعلومات تقريبًا بشكل عام حول لغات البرمجة هذه صالحة. جميع اللغات الثلاث تشبه إلى حد كبير لغة C ، ولكن لكل منها خصائصه الخاصة.

علاوة على ذلك ، من وجهة نظر دراسة التظليل ، عندما لا تثير هذه اللغات أسئلة ، يمكنك معرفة ما هي الفرص التي تتيحها "UnityCG.cginc" والمكتبات الأخرى المكتوبة حسب الوحدة لتبسيط عملها.

لماذا إذا كان في تظليل سيئة؟



المصدر: www.shadertoy.com/view/Md3cWr

من المهم أن نفهم كيف يتم تنفيذ تظليل على مستوى الحديد ولماذا هي سريعة بحيث يمكن أن تؤدي ملايين العمليات دون اجهاد.

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

هناك بعض الفروق الدقيقة والاستثناءات ، ولكن حتى تتمكن من الكتابة بأمان ، يجب أن تفهم كيف يتصرف على الإصدار المستهدف من api البياني. منذ نفس OpenGL ES 2 أو DX11 في هذا الصدد مختلفة جدا.

لماذا أحتاج إلى معرفة ذلك ، لأن هناك محررات عقدة؟




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

موارد مفيدة للتعلم



المصدر: www.shadertoy.com/view/4tlcWj

فيما يتعلق بتعلم برمجة التظليل ، فإن التمرين الجيد هو إعادة كتابة التظليل من www.shadertoy.com أو glslsandbox.com . بالإضافة إلى ذلك ، هناك ملف تعريف رائع لأخصائي من Unity ، حيث يمكنك رؤية الكثير من github.com/keijiro المثير للاهتمام

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

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

كل التأثيرات في المقالة هي تسجيل لتأثيرات shadertoy مع shadertoy.

Source: https://habr.com/ru/post/ar473638/


All Articles