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

أبسط طريقة للمزج هي ضرب لون الملمس بالعتامة ثم جمع النتائج.
float3 blend(float4 texture1, float a1, float4 texture2, float a2) { return texture1.rgb * a1 + texture2.rgb * a2; }
يتم استخدام هذه التقنية في Unity3D في محرر التضاريس القياسي. كما ترون ، فإن الانتقال سلس ولكن غير طبيعي. تبدو الأحجار ملوثة بالتساوي بالرمال ، لكن في العالم الواقعي لا يحدث مثل هذا. لا تلتصق الرمال بالحجارة ، بل تسقط وتملأ الشقوق بينها ، تاركة قمم الحجارة نقية.
دعنا نحاول محاكاة هذا السلوك في مخططات Excel. بما أننا نريد أن "تسقط" الرمال بين الأحجار المرصوفة بالحصى ، فإننا نحتاج إلى خريطة العمق لكل نسيج. في هذا المثال ، نعتبر أن خريطة العمق يتم إنشاؤها من صورة ذات تدرج الرمادي وتخزينها في قناة ألفا من نسيج. في Unity3D ، يمكن القيام بذلك في مفتش النسيج عن طريق تعيين العلامة "Alpha From Grayscale".
بادئ ذي بدء ، سوف ننظر في نموذج مبسط لخريطة عمق الرمال والأحجار.

يرمز الخط الأزرق على قطعة الأرض إلى خريطة عمق الرمال والأحجار المرصوفة بالحصى. لاحظ أن قمم الحجارة أعلى من مستوى الرمال. النظر في هذه الحقيقة ، سنحاول رسم بكسل من هذا الملمس أعلاه.
float3 blend(float4 texture1, float a1, float4 texture2, float a2) { return texture1.a > texture2.a ? texture1.rgb : texture2.rgb; }

ممتاز لا تزال قمم الحجارة المرصوفة نقية بينما تقع الرمل في شقوق بينهما. لكننا لم نعتبر عتامة الطبقة حتى الآن. لاستخدامها نحن فقط نلخص خريطة عمق العمق وخريطة التعتيم.
float3 blend(float4 texture1, float a1, float4 texture2, float a2) { return texture1.a + a1 > texture2.a + a2 ? texture1.rgb : texture2.rgb; }
على حساب الجمع سيكون الملمس الأقل شفافية أعلى من المعتاد.


لذلك لدينا انتقال أكثر طبيعية من الرمال إلى الحجارة. كما ترون ، تبدأ حبيبات الرمل في ملء الشقوق بين الحجارة المرصوفة بالحصى ، مخبئة لهم تدريجيًا. ولكن مع حدوث العمليات الحسابية بالبكسل ، تبدأ الأعمال الفنية في الظهور على الحدود بين القوام. للحصول على نتيجة سلسة ، سنتخذ عدة وحدات بكسل في العمق بدلاً من واحدة ونمزجها.
float3 blend(float4 texture1, float a1, float4 texture2, float a2) { float depth = 0.2; float ma = max(texture1.a + a1, texture2.a + a2) - depth; float b1 = max(texture1.a + a1 - ma, 0); float b2 = max(texture2.a + a2 - ma, 0); return (texture1.rgb * b1 + texture2.rgb * b2) / (b1 + b2); }
في الكود أعلاه ، نحصل في البداية على جزء من الأرض ينظر إليه على عمق معين.

ثم نقوم بتطبيعها للحصول على عتامات جديدة.


نتيجة لذلك ، وجدنا خوارزمية لمزج القوام ، مما يسمح لنا بالوصول إلى مقربة من صورة التضاريس الطبيعية.