سؤال

لقد كنت مهتما (كهواة) في توليد الضوضاء العشوائي العشوائي، وتحديدا خوارزميات البيرلين وبسيط. تتميز ميزة البسيط السرعة (خاصة في الأبعاد العليا)، ولكن البيرين يمكن أن تخلطها بسهولة نسبيا. كنت أتساءل عما إذا كان أي شخص يدرك خوارزمية البلاط البسيطة؟ البعد الثابت على ما يرام، عام هو أفضل؛ pseudocode على ما يرام، C / C ++ أفضل.

هل كانت مفيدة؟

المحلول 3

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

نصائح أخرى

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

uint3 iIdx0 = p0SI % 256;
uint3 iIdx1 = (p0SI + pI1) % 256;
uint3 iIdx2 = (p0SI + pI2) % 256;
uint3 iIdx3 = (p0SI + 1.0f) % 256;
uint iGI0 = gPerm[ iIdx0.x + gPerm[ iIdx0.y + gPerm[ iIdx0.z ] ] ] % 12;
uint iGI1 = gPerm[ iIdx1.x + gPerm[ iIdx1.y + gPerm[ iIdx1.z ] ] ] % 12;
uint iGI2 = gPerm[ iIdx2.x + gPerm[ iIdx2.y + gPerm[ iIdx2.z ] ] ] % 12;
uint iGI3 = gPerm[ iIdx3.x + gPerm[ iIdx3.y + gPerm[ iIdx3.z ] ] ] % 12;

P0SI هي الزاوية 0 نقطة و PI2 و PI2 هي متجهات إلى الزاوية والركن 2 محسوبة بالطريقة المعتادة. لاحظ أنه في مجموعة HLSL تعزز للناقلات تلقائيا في العمليات المختلطة، لذلك على سبيل المثال 1.0F هو في الواقع (1.0،1.01.0). أنا فقط اعتقدت أن هذا البلاط stuf لكنه يعمل أيضا. إذا كنت بحاجة إلى الظل كوكب كبير أو بعض القرف ولكن لديك فقط دقة واحدة على بطاقتك هناك بعض الخطوات الإضافية. ضربنى.

تحرير: أنت تعرف بعد التفكير في الأمر أكثر من ذلك، لا أعتقد أنه عليك تغيير أي شيء. أعتقد أنها بلاطها بسهام عند 256 وحدة كما تم تنفيذها.

حتى لو مرت سنوات قليلة، لا يزال هذا السؤال بين أفضل النتائج على Google.

في الضوضاء البسيطة، X و Y من شبكة مستقيمة (Ortonormal)، احصل على منحرفة للعثور على البسيط النقطة في (مثلث في 2D)، لذلك مع تقنيات البلاط الشائعة (٪ 255 أو أيا كان)، فإن البلاط، ولكن البلاط على إحداثيات منحرفة، وهذا هو البلاط "قطريا"، وهو عديم الفائدة.

حلا بسيطا وجدته هو "Un-Skew" النتيجة، بحيث يتم إحلاله X الأصلي و Y أولا "إلى اليسار"، ثم ستحرف الخوارزمية لهم "إلى اليمين"، والنتيجة النهائية ستكون النتيجة النهائية إعادة محاذاة إلى شبكة غير منحرفة.

إذا كان، على سبيل المثال، فإن تطبيقك البسيط يشبه SimpleXNoise.java يمكنك أن تجد في كل مكان على الشبكة، فإنه يدحرج الشبكة باستخدام:

var F2 = 0.5*(Math.sqrt(3.0)-1.0);
var s = (xin+yin)*F2; // Hairy factor for 2D
var i = Math.floor(xin+s);
var j = Math.floor(yin+s);

يمكنك ببساطة "Skew Skew" في الاتجاه المعاكس عند نقطة الدخول للطريقة:

var G2 = (3.0-Math.sqrt(3.0))/6.0;
var t = (xin+yin)*G2;
xin-=t;
yin-=t;

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

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

كنت بحاجة مؤخرا إلى ضجيج البسيط في البلاط ومرجع هذا السؤال.

للضوضاء البلاط باستخدام أي وظيفة ضوضاء، يمكنك نقل عينات البلاط الإضافية الخطية:

Ftileable(x, y) = ( 
       F(x, y) * (w - x) * (h - y) + 
       F(x - w, y) * (x) * (h - y) + 
       F(x - w, y - h) * (x) * (y) + 
       F(x, y - h) * (w - x) * (y)
) / (wh)

حيث f () هي وظيفة الضوضاء الخاصة بك. لاحظ أن X، يجب أن يتم إحداثيات داخل بلاط فردي: س في [0، W)، Y في [0، H). يمكنك استخدام شيء مثل Tilex = x - math.floor (x / w) * w أو fmod ().

إذا كان الأداء أمرا بالغ الأهمية أو للأبعاد العليا، فقد لا يكون هذا هو الطريق للذهاب لأنه يتطلب بحثا عن 2 ^ d بحثا عن البعد D. كما أنتج قيما أقل نحو مراكز البلاط بالنسبة لي.

مأخوذ من:http://webstaff.itn.liu.se/~stegu/tnm022-2005/perlinnoiselinks/perlin-noise-math-faq.html.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top