আমার পার্লিন নয়েজ কেন "অবরুদ্ধ" দেখাচ্ছে?


21

আমি কেবল তত্ত্বটি ব্যবহার করে পের্লিন নয়েজকে প্রয়োগ করার চেষ্টা করেছি (flafla2.github.io/2014/08/09/perlinnoise.html অনুসরণ করে)। দুর্ভাগ্যক্রমে আমি "আসল" পার্লিন নয়েজটির চেহারা অর্জন করতে অক্ষম ছিলাম।

নীচের কোডটি পার্লিন নয়েজের একটি ব্লক সংস্করণ সরবরাহ করার কারণ কী?

কোডে আমার কী উন্নতি / পরিবর্তন হওয়া উচিত যাতে এটি নিদর্শনগুলি ছাড়াই পার্লিন নয়েজকে উপহার দেয়?

আমার সন্দেহ হয় যেভাবে আমি ইন্টারপোল্ট করি বা gradsভেক্টরটিতে সমস্যা হতে পারে । gradsসব 4 নিকটবর্তী জাফরি পয়েন্টের জন্য - ভেক্টর (জাফরি পয়েন্টের জন্য র্যান্ডম ভেক্টর) এবং (আকার ভেক্টর) এর ডট পণ্য রয়েছে। (এলোমেলো এবং আকারের ভেক্টরগুলি প্রথম লিঙ্কে বর্ণিত হয়েছে।)

জিএলএসএল স্যান্ডবক্স: http://glslsandbox.com/e#32663.0

শব্দে শিল্পকর্ম

float fade(float t) { return t * t * t * (t * (t * 6. - 15.) + 10.); }
vec2 smooth(vec2 x) { return vec2(fade(x.x), fade(x.y)); }

vec2 hash(vec2 co) {
    return fract (vec2(.5654654, -.65465) * dot (vec2(.654, 57.4), co));
}

float perlinNoise(vec2 uv) {
    vec2 PT  = floor(uv);
    vec2 pt  = fract(uv);
    vec2 mmpt= smooth(pt);

    vec4 grads = vec4(
        dot(hash(PT + vec2(.0, 1.)), pt-vec2(.0, 1.)),   dot(hash(PT + vec2(1., 1.)), pt-vec2(1., 1.)),
        dot(hash(PT + vec2(.0, .0)), pt-vec2(.0, .0)),   dot(hash(PT + vec2(1., .0)), pt-vec2(1., 0.))
    );

    return 5.*mix (mix (grads.z, grads.w, mmpt.x), mix (grads.x, grads.y, mmpt.x), mmpt.y);
}

float fbm(vec2 uv) {
    float finalNoise = 0.;
    finalNoise += .50000*perlinNoise(2.*uv);
    finalNoise += .25000*perlinNoise(4.*uv);
    finalNoise += .12500*perlinNoise(8.*uv);
    finalNoise += .06250*perlinNoise(16.*uv);
    finalNoise += .03125*perlinNoise(32.*uv);

    return finalNoise;
}

void main() {
    vec2 position = gl_FragCoord.xy / resolution.y;
    gl_FragColor = vec4( vec3( fbm(3.*position) ), 1.0 );
}

উত্তর:


24

বিরক্তি ভাল দেখায়। এখানে মূল সমস্যাটি হ'ল যে হ্যাশ ফাংশনটি আপনি ব্যবহার করছেন তা খুব ভাল নয়। আমি যদি কেবল একটি অষ্টককে দেখি এবং আউটপুট দিয়ে হ্যাশের ফলাফলটি কল্পনা করি তবে hash(PT).xআমি এরকম কিছু পাই:

খারাপ হ্যাশ ফাংশন

এটি গ্রিড স্কোয়ারে সম্পূর্ণরূপে এলোমেলো হওয়ার কথা, তবে আপনি দেখতে পাচ্ছেন যে এটিতে অনেকগুলি তির্যক রেখার ধরণ রয়েছে (এটি প্রায় একটি চেকবোর্ডের মতো দেখাচ্ছে), সুতরাং এটি খুব এলোমেলো হ্যাশ নয়, এবং সেই নিদর্শনগুলি এতে প্রদর্শিত হবে এটি উত্পাদিত শব্দ।

অন্য সমস্যাটি হ'ল আপনার হ্যাশ কেবল [0, 1] তে গ্রেডিয়েন্ট ভেক্টরকে ফেরত দেয়, যখন তারা সমস্ত দিকে গ্রেডিয়েন্ট পেতে [−1, 1] এ থাকা উচিত। এই অংশটি রিম্যাপ করে ঠিক করা সহজ।

এই সমস্যাগুলি সমাধান করার জন্য, আমি এই হ্যাশ ফাংশনটি ব্যবহার করার জন্য কোডটি স্যুইচ করেছি (যা আমি মিকেল জিজোয়েলের কাছ থেকে শিখেছি এবং সম্ভবত ডব্লুজেজে রেয়ের একটি কাগজের কারণে ):

vec2 hash(vec2 co) {
    float m = dot(co, vec2(12.9898, 78.233));
    return fract(vec2(sin(m),cos(m))* 43758.5453) * 2. - 1.;
}

দ্রষ্টব্য যে ট্রিগ ফাংশনগুলির কারণে এটি আপনার সংস্করণ থেকে কিছুটা ব্যয়বহুল হতে চলেছে। যাইহোক, এটি ফলাফলের শব্দের চেহারা যথেষ্ট উন্নত করে:

আরও ভাল হ্যাশ ফাংশন সহ fbm গোলমাল


আপনাকে ধন্যবাদ খুব আপনার ব্যাখ্যা জন্য এত। এটি সম্ভবত অফ-টপিক, তবে আমি যাইহোক জিজ্ঞাসা করব; কিছু উত্স কোড যা শব্দের গণনা করে, লোকেরা বর্তমান স্থানাঙ্কের সাথে ডট পণ্য গণনা করতে ভেক্টর ভেক 3 (1, 57, 113) ব্যবহার করে (আমি মনে করি লক্ষ্যটি হ্যাশ অর্জন করাও)। কেন ধ্রুবকের এই বিশেষ পছন্দটি (57 ডিগ্রিতে প্রায় 1 রেডিয়ান, 133 = প্রায় 2 ডিগ্রিতে রেডিয়ান)? এটি কি ট্রিগ ফাংশনগুলিতে পর্যায়ক্রমিকতার কারণে? আমি এটি গুগল করতে অক্ষম।
সরস্বতী

3
@ সরস্বতী আমি সত্যিই নিশ্চিত নই, তবে একটি অনুমান যে 57 এবং 113 বেছে নেওয়া হয়েছে কারণ তারা প্রধান সংখ্যা is (১১৩ প্রাইম; 57 নয়, তবে এটি 3 * 19, তাই এখনও কাইন্ডা প্রাইমী ... যদি এটি কোনও জিনিস হয়)) একটি প্রাইম-ইশ সংখ্যার দ্বারা গুণ বা মোডিং বিটগুলিকে ঝাঁকুনি দেয়, তাই এটি অস্বাভাবিক নয় not hashes মধ্যে উপাদান।
নাথান রিড

1
@ কেট আমি সন্দেহ করি যে জিএলএসএল প্রোগ্রামগুলি নির্বিচারক হিসাবে প্রদত্ত GLSL এর একটি পিআরএনজি রয়েছে।
ব্যবহারকারী 253751

1
দেখে মনে হচ্ছে এই মন্তব্য থ্রেডে বেশ কয়েকটি সম্ভাব্য নতুন প্রশ্ন রয়েছে ...
ট্রাইকপ্লেক্স

1
আমার কাছে সেই নিদর্শনগুলি ছিল এবং এই র্যান্ড () ফাংশনটি এটি ঠিক করেছিল। আমার ভূখণ্ডে আমি 2 কিলোমিটারের মতো হাঁটার পরে সমস্যাটি হল, ওপিগুলির মতো নিদর্শনগুলি আবার দেখাতে শুরু করে। এটি এখানে হ্যাশ ফাংশনটি ব্যবহার করছিল: amindfireverprogramming.blogspot.com/2013/07/… যা শিল্পকর্মগুলি দূরে সরিয়ে নিয়েছে (100 কিলোমিটার দূরত্বে, বিসি অবোধের বাদে, তবে ঠিক আছে আমি ঠিক খণ্ডে বিভক্ত হয়েছি এবং পেয়েছি যে উভয় মান ধরে রেখে কাজ করা, যা পার্লিন শব্দটি প্রায় অনির্দিষ্টকালের জন্য চলতে পারে)। সুতরাং, আমি সম্ভবত এখানে একই সমস্যা আছে এমন কাউকে সহায়তা করার জন্য এটি এখানে রেখে দেব।
নিকোলাস পাইপিটোন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.