আমি কেবল তত্ত্বটি ব্যবহার করে পের্লিন নয়েজকে প্রয়োগ করার চেষ্টা করেছি (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 );
}