আপনি কীভাবে টাইলিবল পার্লিন শব্দটি তৈরি করতে পারেন?


127

সম্পর্কিত:

আমি টাইলিযোগ্য পার্লিন শব্দটি উত্পন্ন করতে চাই। আমি পল বোর্কের PerlinNoise*() কাজগুলি থেকে কাজ করছি , যা এই জাতীয়:

// alpha is the "division factor" (how much to damp subsequent octaves with (usually 2))
// beta is the factor that multiplies your "jump" into the noise (usually 2)
// n is the number of "octaves" to add in
double PerlinNoise2D(double x,double y,double alpha,double beta,int n)
{
   int i;
   double val,sum = 0;
   double p[2],scale = 1;

   p[0] = x;
   p[1] = y;
   for (i=0;i<n;i++) {
      val = noise2(p);
      sum += val / scale;
      scale *= alpha;
      p[0] *= beta;
      p[1] *= beta;
   }
   return(sum);
}

কোড ব্যবহার করে:

real val = PerlinNoise2D( x,y, 2, 2, 12 ) ; // test

return val*val*skyColor + 2*val*(1-val)*gray + (1-val)*(1-val)*cloudColor ;

আকাশের মতো দেয়

nontileable

যা টাইলিবল নয়।

পিক্সেল মানগুলি 0-> 256 (প্রস্থ এবং উচ্চতা), এবং পিক্সেল (0,0) ব্যবহার করে (x, y) = (0,0) এবং পিক্সেল (256,256) ব্যবহার করে (x, y) = (1,1)

আমি কীভাবে এটি টাইলিবল করতে পারি?


14
শুধু এফওয়াইআই, আপনার কাছে যা আছে তা পার্লিনের শব্দ নেই; এটা ফ্র্যাক্টাল গোলমাল। পার্লিন শব্দটি হ'ল ফ্র্যাক্টাল গোলমালের প্রতিটি অষ্টক উত্পন্ন "শোনজ 2" ফাংশন।
নাথান রেড

উত্তর:


80

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

import random
import math
from PIL import Image

perm = range(256)
random.shuffle(perm)
perm += perm
dirs = [(math.cos(a * 2.0 * math.pi / 256),
         math.sin(a * 2.0 * math.pi / 256))
         for a in range(256)]

def noise(x, y, per):
    def surflet(gridX, gridY):
        distX, distY = abs(x-gridX), abs(y-gridY)
        polyX = 1 - 6*distX**5 + 15*distX**4 - 10*distX**3
        polyY = 1 - 6*distY**5 + 15*distY**4 - 10*distY**3
        hashed = perm[perm[int(gridX)%per] + int(gridY)%per]
        grad = (x-gridX)*dirs[hashed][0] + (y-gridY)*dirs[hashed][1]
        return polyX * polyY * grad
    intX, intY = int(x), int(y)
    return (surflet(intX+0, intY+0) + surflet(intX+1, intY+0) +
            surflet(intX+0, intY+1) + surflet(intX+1, intY+1))

পার্লিন শব্দটি সামান্য "সার্ফলেট" এর সংমিশ্রণ থেকে উত্পন্ন হয় যা এলোমেলোভাবে ভিত্তিক গ্রেডিয়েন্ট এবং পৃথকযোগ্য বহুবর্ষীয় ফলফ ফাংশনের উত্পাদন। এটি একটি ইতিবাচক অঞ্চল (হলুদ) এবং নেতিবাচক অঞ্চল দেয় (নীল)

শাঁস

সার্ফলেটগুলির 2x2 ব্যাপ্তি থাকে এবং এটি পূর্ণসংখ্যার জাল পয়েন্টগুলিতে কেন্দ্রীভূত হয়, তাই স্পেসের প্রতিটি বিন্দুতে পার্লিন শোরগোলের মানটি এটি কোষের কোণে থাকা সার্ফলেটগুলি যোগ করে তৈরি করা হয় ming

সঙ্কলন

আপনি যদি কিছু সময়ের সাথে গ্রেডিয়েন্ট দিকগুলি মোড়ানো করেন তবে শব্দটি নিজেই একই সময়কালে বিজোড়হীনভাবে মোড়ানো হবে। এই কারণেই উপরের কোডটি জালিকান স্থানাঙ্কের মড্যালোটিকে পেরিটেশন টেবিলের মাধ্যমে হ্যাশ করার আগে পিরিয়ড নেয় takes

অন্য পদক্ষেপটি হ'ল অষ্টভীর সংমিশ্রনের সময় আপনি অষ্টভের ফ্রিকোয়েন্সি সহ সময়কালটি স্কেল করতে চান। মূলত, আপনি প্রতিটি অষ্টকটি একাধিকবারের চেয়ে একবারে পুরো ন্যায় চিত্রটি একবার টাইল করতে চাইবেন:

def fBm(x, y, per, octs):
    val = 0
    for o in range(octs):
        val += 0.5**o * noise(x*2**o, y*2**o, per*2**o)
    return val

এটি একসাথে রাখুন এবং আপনি এই জাতীয় কিছু পান:

size, freq, octs, data = 128, 1/32.0, 5, []
for y in range(size):
    for x in range(size):
        data.append(fBm(x*freq, y*freq, int(size*freq), octs))
im = Image.new("L", (size, size))
im.putdata(data, 128, 128)
im.save("noise.png")

টাইলিবল fBm শব্দ

আপনি দেখতে পাচ্ছেন, এটি সত্যই নির্বিঘ্নে টালি করে:

fBm গোলমাল, টাইল্ড

কিছু ছোট টুইট এবং রঙ ম্যাপিংয়ের সাথে, এখানে মেঘের চিত্রটি 2x2 টাইল করা আছে:

মেঘ!

আশাকরি এটা সাহায্য করবে!


3
আমি একটি অজগর লোক না, তাই আমি জিজ্ঞাসা, x*2**oসি রূপান্তর কিভাবে ? এটা: x*pow(2,o)বা pow(x*2,o)?
আদর্শ

7
x*pow(2, o), যেহেতু গুনফলের তুলনায় ক্ষয়ক্ষতির উচ্চতর প্রাধান্য রয়েছে।
জন কলসবেক

1
কেউ এটিকে সি-তে রূপান্তর করতে পারে? এই কোডটি বোঝার ক্ষেত্রে আমার বড় সমস্যা রয়েছে, কারণ অজগর দিয়ে আমি কখনও কিছুই করি নি। উদাহরণস্বরূপ aমূল্য কি ? এবং আমি নিশ্চিত না যে কীভাবে ফাংশনগুলি সিতে রূপান্তরিত হয় ... আমি কেবল আউটপুটে সরাসরি লাইন পাই।
আদর্শ

1
আপনার শব্দের ডোমেনটি আপনার টাইলের আকারের সাথে আবদ্ধ হওয়ার সাথে সাথে আপনি যতক্ষণ না ঠিক থাকেন এটি এটি অবশ্যই সেরা সমাধান। উদাহরণস্বরূপ, এটি নির্বিচারে আবর্তনের অনুমতি দেয় না। তবে আপনার যদি এ জাতীয় কোনও প্রয়োজন না হয় তবে এটি আদর্শ উত্তর।
জন কলসবিেক

1
দ্রষ্টব্য: আপনি যদি 128 এর চেয়ে অন্য আকার তৈরি করতে চান তবে লাইনে সংখ্যার মানগুলি পরিবর্তন করবেন না im.putdata(data, 128, 128)। : (পাইথন বা PIL অপরিচিত তাদের জন্য তারা স্কেল মানে এবং অফসেট, না ছবির আকার।)
Antti Kissaniemi

87

এখানে একটি চতুর উপায় 4D পার্লিন শব্দ ব্যবহার করে।

মূলত, আপনার পিক্সেলের এক্স স্থানাঙ্ককে একটি 2D চেনাশোনাতে ম্যাপ করুন এবং আপনার পিক্সেলের ওয়াই স্থানাংককে দ্বিতীয় 2 ডি বৃত্তের সাথে ম্যাপ করুন এবং 4D স্পেসে এই দুটি বৃত্তকে অরথোগোনাল স্থাপন করুন। ফলস্বরূপ টেক্সচারটি টাইলযোগ্য, এর কোনও সুস্পষ্ট বিকৃতি নেই এবং মিররযুক্ত টেক্সচারটি এমনভাবে পুনরাবৃত্তি করে না।

নিবন্ধ থেকে অনুলিপি কোড:

for x=0,bufferwidth-1,1 do
    for y=0,bufferheight-1,1 do
        local s=x/bufferwidth
        local t=y/bufferheight
        local dx=x2-x1
        local dy=y2-y1

        local nx=x1+cos(s*2*pi)*dx/(2*pi)
        local ny=y1+cos(t*2*pi)*dy/(2*pi)
        local nz=x1+sin(s*2*pi)*dx/(2*pi)
        local nw=y1+sin(t*2*pi)*dy/(2*pi)

        buffer:set(x,y,Noise4D(nx,ny,nz,nw))
    end
end

3
এটি অবশ্যই সঠিক উত্তর। মাত্রা যুক্ত করা একটি পুরাতন গণিতের কৌশল ian অলিন্দে রডরিগস ডসেট (স্যার ডাব্লুআর হ্যামিল্টন ডোজট খুব বেশি তবে কিছুটা কম)
FxIII

@ এফএক্সআইআইআই, আপনি কি জানেন যে এই নয়েজ 4 ডি () কীভাবে কার্যকর করা উচিত? আমি এটি চেষ্টা করতে চাই তবে এই Noise4D () কীভাবে কাজ করা উচিত তা সম্পর্কে আমার কোনও ধারণা নেই।
আদর্শ

4
আপনি যে কোনও 4 ডি শোনার ফাংশন ব্যবহার করতে পারেন। সরল আওয়াজ আমার পরামর্শ হতে হবে। webstaff.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf
জন কলসবিেক

2
ধন্যবাদ জন! এটা কাজ পেয়েছে, মিষ্টি! এটি কেউ বলেনি, তবে: x1, y1, x2, y2 মনে হয় কোনও প্রকারের স্কেলিং, বৃহত্তর দূরত্ব, বিস্তারিত শব্দ noise যদি এই কাউকে সাহায্য করে।
আদর্শ

5
নোট করুন যে এটি টোপোলজিক্যালি বোবোবোবাবের উত্তরের সমতুল্য: আপনার ম্যাপিংটি 2-টরাসকে একটি ℝ⁴ তে এম্বেড করে, এটি মেট্রিক বিকৃতি ছাড়াই সম্ভব it এ এম্বেড করার সময় আপনি অবিচ্ছিন্নভাবে পেতে পারেন ℝ³
বামপাশে

22

ঠিক আছে, আমি বুঝতে পেরেছি. উত্তরটি হ'ল 3 ডি শব্দে একটি টরাসে হাঁটুন এবং এর বাইরে 2D টেক্সচার তৈরি করুন।

টরাস 2 ডায়ার মোড়কে দেয়

কোড:

Color Sky( double x, double y, double z )
{
  // Calling PerlinNoise3( x,y,z ),
  // x, y, z _Must be_ between 0 and 1
  // for this to tile correctly
  double c=4, a=1; // torus parameters (controlling size)
  double xt = (c+a*cos(2*PI*y))*cos(2*PI*x);
  double yt = (c+a*cos(2*PI*y))*sin(2*PI*x);
  double zt = a*sin(2*PI*y);
  double val = PerlinNoise3D( xt,yt,zt, 1.5, 2, 12 ) ; // torus

  return val*val*cloudWhite + 2*val*(1-val)*gray + (1-val)*(1-val)*skyBlue ;
}

ফলাফল:

একদা:

টিলাবল আকাশ

এবং টাইলস:

এটি টাইলস দেখাচ্ছে


6
এটি কিন্ডাটি কাজ করে তবে দেখে মনে হচ্ছে আপনি ট্যারাসের বক্রতার কারণে একগুচ্ছ বিকৃতি পেয়ে যাচ্ছেন।
নাথান রিড

1
আপনি কেবলমাত্র পজিশনটি মডুলো করতে পারেন তবে আমি এই প্রশ্নের সমস্ত দুর্দান্ত / সৃজনশীল উত্তর পছন্দ করি। একই জিনিসটি করার বিভিন্ন উপায়।

আমি লক্ষ্য করেছি যে আপনি আসলে 0-1 মান ব্যবহার করতে চান না, তবে 0-0.9999 ... মানগুলি! সুতরাং আপনি ব্যবহার করতে পারেন: এক্স / প্রস্থ, y / উচ্চতা ইত্যাদি। নাহলে seams মিলছে না (বিপরীত প্রান্তগুলি হুবহু একই পিক্সেল তৈরি করে)। এছাড়াও দেখে মনে হচ্ছে পার্লিননয়েস 3 ডি () ফাংশনটিরও ফলাফল মানটির জন্য ক্ল্যাম্পিং দরকার হয়, বা কিছু পিক্সেল মান ওভারফ্লো হয়।
আদর্শ

@ নাথান, আপনি কীভাবে বিকৃতিটি ঠিক করতে জানেন?
আদর্শ

2
@idev আমি বিশ্বাস করি যে বিকৃতিটি সমাধানের উপায় হ'ল এই প্রশ্নের উপরের উত্তরে 4D পদ্ধতিটি ব্যবহার করা। ;)
নাথান রিড

16

একটি সহজ উপায় যা আমি ভাবতে পারি তা হ'ল গোলমাল ফাংশনটির আউটপুট নেওয়া এবং মিরর করা / এটি কোনও আকারের দ্বিগুণ আকারের একটি ছবিতে ফ্লিপ করা। এটি ব্যাখ্যা করা এত কঠিন যে এখানে একটি চিত্র: এখানে চিত্র বর্ণনা লিখুন

এখন, এক্ষেত্রে আপনি এটি কীভাবে করেছেন তা খুব স্পষ্ট। আমি এটি সমাধান করার দুটি উপায় সম্পর্কে (সম্ভবত :-)) ভাবতে পারি:

  1. আপনি যে বৃহত্তর চিত্রটি নিতে পারেন এবং তারপরে এরপরে আরও কিছু শব্দ তৈরি করতে পারেন তবে (এবং আমি নিশ্চিত না এটি সম্ভব কিনা) মাঝের দিকে দৃষ্টি নিবদ্ধ করে (যাতে প্রান্তগুলি একই থাকে)। এটি অতিরিক্ত পার্থক্য যুক্ত করতে পারে যা আপনার মস্তিষ্ককে ভাববে যে এটি কেবল মিরর ইমেজ নয়।

  2. (এটি সম্ভব কিনা তাও আমি নিশ্চিত নই) আপনি প্রাথমিক চিত্রটি আলাদাভাবে উত্পন্ন করতে শোর ফাংশনটির ইনপুটগুলির সাথে ফিডিং করার চেষ্টা করতে পারেন। আপনাকে এটি পরীক্ষা এবং ত্রুটি করেই করতে হবে তবে আপনি এমন বৈশিষ্ট্যগুলি সন্ধান করুন যা আপনার চোখ আঁকবে যখন আপনি এটি টাইল / মিরর করেন এবং তারপরে চেষ্টা করুন এবং সেগুলি তৈরি না করার জন্য পান।

আশাকরি এটা সাহায্য করবে.


3
খুব সুন্দর তবে অনেকটা প্রতিসম!
bobobobo

1
@ ববোবোও আমি ভাবছিলাম অন্যান্য পদক্ষেপগুলি হ্রাস পাবে। সুতরাং, আপনি এই পদ্ধতিটি ব্যবহার করে একটি "বেস" তৈরি করতে পারেন এবং তারপরে এটি মিরর নয় বলে মনে করার জন্য পুরো জিনিসটির উপরে আরও কিছু বিশদ যুক্ত করুন।
রিচার্ড মার্স্কেল - ড্র্যাকির

আপনি যখন এই জাতীয় জিনিসটি করেন তখন আপনি কিছু অদ্ভুত নিদর্শন পেতে শুরু করেন। এটি বিশেষত একরকম প্রজাপতির মতো দেখায়। সহজ সমাধান, যদিও।
notlesh

এটা আমার প্রথম পদ্ধতির খুব ছিল, কিন্তু এটা একটা সমস্যা দৃশ্যমান এখানে রয়েছে: dl.dropbox.com/u/6620757/noise_seam.png আপনি ক্রস হচ্ছে একটি উল্টানো সীমানা আপনি অবিলম্বে ঢাল ইনভার্টারিং দ্বারা গোলমাল ফাংশন একটি অসংলগ্ন করা কারণ ফাংশন। এমনকি আপনি যদি উপরে একটি দ্বিতীয় শোনার ফাংশন প্রয়োগ করেন তবে তা এখনও আউটপুটে দৃশ্যমান হতে পারে।
ঝাড়িকো

ভালো বুদ্ধি. এটি ত্রিভুজ তরঙ্গ ফাংশনটি ব্যবহার করে খুব সহজেই পিক্সেল tex2d(abs(abs(uv.x)%2.0-1.0), abs(abs(uv.y)%2.0-1.0))
শেডারে করা যায়

10

এই উত্তরের প্রথম সংস্করণটি আসলে ভুল ছিল, আমি এটি আপডেট করেছি

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

আমরা কীভাবে noise2()সাময়িকী করতে পারি ? বেশিরভাগ বাস্তবায়নে, এই ফাংশনটিতে এক ধরণের জালিক শব্দ ব্যবহৃত হয়। এটি হ'ল এটি পূর্ণসংখ্যার স্থানাঙ্কে এলোমেলো সংখ্যা পায় এবং এগুলিকে ইন্টারপোলিট করে। উদাহরণ স্বরূপ:

function InterpolatedNoise_1D(float x)

  integer_X    = int(x)
  fractional_X = x - integer_X

  v1 = SmoothedNoise1(integer_X)
  v2 = SmoothedNoise1(integer_X + 1)

  return Interpolate(v1 , v2 , fractional_X)

end function

পূর্ণসংখ্যা সময়ের সাথে পর্যায়ক্রমিক হয়ে ওঠার জন্য এই ফাংশনটি তুচ্ছভাবে সংশোধন করা যেতে পারে। কেবল একটি লাইন যুক্ত করুন:

integer_X = integer_X % Period

গণনা করার আগে v1এবং v2। এইভাবে, পূর্ণসংখ্যার স্থানাঙ্কের মানগুলি প্রতিটি পিরিয়ড ইউনিটগুলির পুনরাবৃত্তি করবে এবং অন্তরঙ্গকরণ নিশ্চিত করবে যে ফলস্বরূপ ফাংশনটি মসৃণ।

নোট করুন, তবে, এটি কেবল পিরিয়ড 1 এর চেয়ে বেশি হলে কাজ করে So


তবে আপনি কীভাবে noise2সাময়িকী তৈরি করবেন (একটি স্বল্প সময়ের সাথে যেমন 1 ইউনিট)? আমি মনে করি এটিই প্রশ্নটি শেষ পর্যন্ত জিজ্ঞাসা করছে। স্ট্যান্ডার্ড পার্লিন গোলমাল প্রতিটি অক্ষের 256 পিরিয়ড সহ পর্যায়ক্রমিক হয় তবে আপনি একটি ছোট সময়ের সাথে সংশোধিত গোলমাল চান।
নাথান রিড

@Nathan রিড যদি আপনি কল noise2হিসাবে প্রস্তাব, আপনি হবে , পর্যাবৃত্ত ফলাফল পেতে কিনা ফাংশন নিজেই পর্যাবৃত্ত কি না। কারণ আর্গুমেন্টগুলি প্রতি 1 ইউনিটকে ঘিরে রাখে।
কিছু মনে করবেন না

1
তবে আপনি গ্রিড লাইনে seams পান, তাই না? যেহেতু কোনও গ্যারান্টি নেই যে শব্দ 2 (0, 0.999) শব্দ 2 (0, 0) এর নিকটে কিছু আছে, যদি না আমি কিছু মিস করি।
নাথান রিড

1
@ নাথান রিড এটি একটি ভাল বিষয়। আসলে, আমি কেবল আমার পুরানো কোডটি আবার যাচাই করেছিলাম এবং দেখা গেছে যে আমি ভুল ছিল। আমি এখনই উত্তর সম্পাদনা করব।
কিছু নয়

গ্রেট! এটি আসলে এখন একটি ভাল উত্তর। +1 :)
নাথান রেড

6

আরেকটি বিকল্প হ'ল লাইবনেজ লাইব্রেরি ব্যবহার করে শব্দ উত্পন্ন করা। আপনি নির্বিঘ্নে তাত্ত্বিক অসীম পরিমাণে শব্দটি উত্পন্ন করতে পারেন।

নিম্নলিখিতটি একবার দেখুন: http://libnoise.sourceforge.net/tutorials/tutorial3.html#tile

উপরের উপরে একটি এক্সএনএ পোর্টও রয়েছে: http ://bigblack block.com/tools/libnoisexna

যদি আপনি এক্সএনএ পোর্টটি ব্যবহার করে শেষ করেন তবে আপনি এই জাতীয় কিছু করতে পারেন:

Perlin perlin = new Perlin();
perlin.Frequency = 0.5f;                //height
perlin.Lacunarity = 2f;                 //frequency increase between octaves
perlin.OctaveCount = 5;                 //Number of passes
perlin.Persistence = 0.45f;             //
perlin.Quality = QualityMode.High;
perlin.Seed = 8;

//Create our 2d map
Noise2D _map = new Noise2D(CHUNKSIZE_WIDTH, CHUNKSIZE_HEIGHT, perlin);

//Get a section
_map.GeneratePlanar(left, right, top, down);

জেনারেটপ্ল্যানার হ'ল ফাংশনটি প্রতিটি দিকের অংশগুলি পাওয়ার জন্য কল করার জন্য যা বাকী সমস্ত টেক্সচারের সাথে নির্বিঘ্নে সংযুক্ত হবে।

অবশ্যই, এই পদ্ধতিটি একক টেক্সচারের চেয়ে আরও ব্যয়বহুল যা একাধিক পৃষ্ঠতল জুড়ে ব্যবহার করা যেতে পারে। আপনি যদি কিছু এলোমেলো টাইল টেক্সচার তৈরি করতে চাইছেন তবে এটি আপনার আগ্রহী কিছু হতে পারে।


6

যদিও এখানে কিছু উত্তর রয়েছে যা কার্যকর হবে তবে তাদের বেশিরভাগই জটিল, ধীর এবং সমস্যাযুক্ত।

আপনাকে যা করতে হবে তা হ'ল পর্যায়ক্রমিক শব্দ উত্পন্নকরণের ক্রিয়া ব্যবহার করা। এটাই!

পার্লিনের "উন্নত" শব্দের অ্যালগরিদমের উপর ভিত্তি করে একটি দুর্দান্ত পাবলিক ডোমেন বাস্তবায়ন এখানে পাওয়া যাবে । আপনার যে ফাংশনটি প্রয়োজন তা হ'ল pnoise2। কোডটি স্টিফান গুস্তাভসন লিখেছিলেন, যিনি ঠিক এই বিষয়টি সম্পর্কে এখানে একটি সুস্পষ্ট মন্তব্য করেছেন এবং অন্যেরা কীভাবে ভুল পদ্ধতির দিকে নিয়েছে। গুস্তাভসনের কথা শুনুন, তিনি জানেন যে তিনি কী বলছেন।

বিভিন্ন গোলক অনুমান সম্পর্কে কিছু এখানে পরামর্শ দিয়েছেন: ভাল, তারা মূলত কাজ করে (ধীরে ধীরে), তবে তারা একটি 2D টেক্সচারও তৈরি করে যা একটি সমতল গোলক, যাতে প্রান্তগুলি আরও ঘনীভূত হয়, সম্ভবত অনাকাঙ্ক্ষিত প্রভাব তৈরি করে। অবশ্যই, যদি আপনি মনস্থ করা আপনার 2D জমিন জন্য একটি গোলক সম্মুখের অভিক্ষিপ্ত করা হবে, যে ভাবেই যান, কিন্তু যে কি জন্য জিজ্ঞাসা করা হয়েছিল নয়।


4

টাইল্ড গোলমাল করার আরও অনেক সহজ উপায় এখানে:

শেডারটোয় কোড থেকে টাইলিং পার্লিন শব্দ

গোলমালের প্রতিটি স্কেলের জন্য আপনি একটি মডুলার মোড়ানো ব্যবহার করেন। এগুলি আপনি কোনও ফ্রিকোয়েন্সি স্কেল ব্যবহার করেন না কেন ক্ষেত্রের প্রান্তগুলি ফিট করে। সুতরাং আপনাকে কেবলমাত্র 2D গোলমাল ব্যবহার করতে হবে যা অনেক দ্রুত। এখানে লাইভ ওয়েবজিএল কোড যা শ্যাডারটয়টিতে পাওয়া যাবে: https://www.shadertoy.com/view/4dlGW2

শীর্ষ তিনটি ফাংশন সমস্ত কাজ করে এবং fBM 0.0 থেকে 1.0 পরিসীমাতে ভেক্টর x / y পাশ করে।

// Tileable noise, for creating useful textures. By David Hoskins, Sept. 2013.
// It can be extrapolated to other types of randomised texture.

#define SHOW_TILING
#define TILES 2.0

//----------------------------------------------------------------------------------------
float Hash(in vec2 p, in float scale)
{
    // This is tiling part, adjusts with the scale...
    p = mod(p, scale);
    return fract(sin(dot(p, vec2(35.6898, 24.3563))) * 353753.373453);
}

//----------------------------------------------------------------------------------------
float Noise(in vec2 x, in float scale )
{
    x *= scale;

    vec2 p = floor(x);
    vec2 f = fract(x);
    f = f*f*(3.0-2.0*f);
    //f = (1.0-cos(f*3.1415927)) * .5;
    float res = mix(mix(Hash(p,                  scale),
        Hash(p + vec2(1.0, 0.0), scale), f.x),
        mix(Hash(p + vec2(0.0, 1.0), scale),
        Hash(p + vec2(1.0, 1.0), scale), f.x), f.y);
    return res;
}

//----------------------------------------------------------------------------------------
float fBm(in vec2 p)
{
    float f = 0.4;
    // Change starting scale to any integer value...
    float scale = 14.0;
    float amp = 0.55;
    for (int i = 0; i < 8; i++)
    {
        f += Noise(p, scale) * amp;
        amp *= -.65;
        // Scale must be multiplied by an integer value...
        scale *= 2.0;
    }
    return f;
}

//----------------------------------------------------------------------------------------
void main(void)
{
    vec2 uv = gl_FragCoord.xy / iResolution.xy;

#ifdef SHOW_TILING
    uv *= TILES;
#endif

    // Do the noise cloud (fractal Brownian motion)
    float bri = fBm(uv);

    bri = min(bri * bri, 1.0); // ...cranked up the contrast for no reason.
    vec3 col = vec3(bri);

#ifdef SHOW_TILING
    vec2 pixel = (TILES / iResolution.xy);
    // Flash borders...
    if (uv.x > pixel.x && uv.y > pixel.y                                        // Not first pixel
    && (fract(uv.x) < pixel.x || fract(uv.y) < pixel.y) // Is it on a border?
    && mod(iGlobalTime-2.0, 4.0) < 2.0)                 // Flash every 2 seconds
    {
        col = vec3(1.0, 1.0, 0.0);
    }
#endif
    gl_FragColor = vec4(col,1.0);
}

1
আপনার চিত্রের লিঙ্কটি মারা গেছে। আমি একটি সেরা অনুমান করেছি এবং আপনার পোস্ট করা শেডারটো কোড থেকে আউটপুটটির স্ক্রিন শট দিয়ে এটিকে প্রতিস্থাপন করেছি। যদি এটি সঠিক না হয় তবে দয়া করে আপনার পছন্দসই চিত্রটি সরাসরি স্ট্যাক এক্সচেঞ্জ সার্ভারে পুনরায় আপলোড করুন।
পিকালেক

3

টাইলের কিনারা (প্রান্ত-মোড়ানো) এর প্রান্তের কাছে আমার কিছু খারাপ-খারাপ ফলাফল বিভক্ত ছিল , তবে এটি আপনি কী প্রভাব অর্জন করার চেষ্টা করছেন এবং সঠিক শব্দ পরামিতিগুলির উপর নির্ভর করে। কিছুটা অস্পষ্ট শব্দের জন্য দুর্দান্ত কাজ করে, স্পাইকি / সূক্ষ্ম দানাযুক্তগুলির সাথে এত ভাল নয় not


0

আমি একটি অনুরূপ সমস্যা একটি উত্তরের জন্য অনুসন্ধান এই থ্রেড চেক করা হয়, তারপর আমি এই বিকাশকারীর কাছ থেকে একটি পরিষ্কার এবং ঘনবিন্যস্ত সমাধান পেয়েছিলাম পাইথন কোড পারলিন / সিমপ্লেক্স গোলমাল থেকে বের ফ্র্যাক্টাল গোলমাল তৈরি করতে। আপডেট করা কোডটি এই (বদ্ধ) ইস্যুতে সরবরাহ করা হয়েছে এবং "জেনারেটর" এর ডান পাশের গ্রেডিয়েন্টগুলি বাম পাশের (এবং উপরে এবং নীচের অংশের সমান) সমান পুনরায় শুরু করা যেতে পারে যেমন

# Gradients
angles = 2*np.pi*np.random.rand(res[0]+1, res[1]+1)
gradients = np.dstack((np.cos(angles), np.sin(angles)))
# Make the noise tileable
gradients[-1,:] = gradients[0,:]
gradients[:,-1] = gradients[:,0]

একটি মার্জিত এবং পরিষ্কার সমাধান হিসাবে মনে হচ্ছে, আমি এখানে পুরো কোডটি অনুলিপি করা এড়াচ্ছি (যেহেতু এটি আমার নিজস্ব সমাধান নয়) তবে এটি উপরের লিঙ্কটিতে উপলব্ধ। প্রত্যাশিত কারুকাজ বা বিকৃতিবিহীন এমন একটি টাইলিবল ফ্র্যাক্টাল 2 ডি চিত্র তৈরি করতে চাইছেন এমন ব্যক্তির জন্য এটি আশা করি।

টাইলিবল ফ্র্যাক্টাল অঞ্চল

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.