জিএলএসএল এর জন্য র্যান্ডম / শোর ফাংশন functions


179

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

বিশেষত, আমি আশা করতাম:

ক) সিউডো-এলোমেলো ফাংশন - এন-ডাইমেনশনাল, ইউনিফর্ম বিতরণ [-1,1] বা [0,1] এর উপরে, এম-ডাইমেনশনাল বীজ থেকে গণনা করা (আদর্শভাবে কোনও মান হওয়ায় তবে আমি বীজকে সংযত রাখার সাথে সাথে ঠিক আছি) বলতে হবে, অভিন্ন ফলাফল বিতরণের জন্য 0..1)। কিছুটা এইরকম:

float random  (T seed);
vec2  random2 (T seed);
vec3  random3 (T seed);
vec4  random4 (T seed);
// T being either float, vec2, vec3, vec4 - ideally.

খ) ধারাবাহিক গোলমাল পারলিন মত নয়েজ - আবার, এন-মাত্রিক + - অভিন্ন বন্টন, মূল্যবোধের সবাধ সেট দিয়ে এবং, ভাল, খুঁজছি ভাল (কিছু অপশন কনফিগার করতে পারলিন মাত্রা মত চেহারা খুব উপযোগী হতে পারে)। আমি স্বাক্ষরগুলি যেমন আশা করি:

float noise  (T coord, TT seed);
vec2  noise2 (T coord, TT seed);
// ...

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

উত্তর:


263

খুব সাধারণ সিউডোরোন্ডম-দর্শনীয় স্টাফের জন্য, আমি এই অনেলাইনারটি ইন্টারনেটে কোথাও খুঁজে পেয়েছি:

float rand(vec2 co){
    return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}

আপনি নিজের পছন্দমতো PRNG ব্যবহার করে একটি শব্দের টেক্সচারও তৈরি করতে পারেন, তারপরে এটি সাধারণ ফ্যাশনে আপলোড করুন এবং আপনার শেডারের মানগুলি নমুনা করুন; আপনি চাইলে আমি পরে একটি কোড নমুনা খনন করতে পারি।

এছাড়াও, পার্লিন এবং সিম্প্লেক্স শোরগোলের জিএলএসএল বাস্তবায়নের জন্য এই ফাইলটি দেখুন , স্টেফান গুস্তাভসন।


14
আপনি কিভাবে ব্যবহার করবেন vec2 co? এটা কি পরিসীমা? বীজ?
রস

12
এই অ্যালগরিদম (উদাহরণস্বরূপ, এস 3 এর এআরএম মালি) দিয়ে লো-স্পষ্টতা ভাসমান-পয়েন্ট টুকরা ছায়াগুলির থেকে সাবধান থাকুন: স্ট্যাকওভারফ্লো / সিকিউশনস / 11293628/…Github.com/ashima/webgl-noise প্রকল্পের lowp বিষয় আছে বলে মনে হচ্ছে না।
পিটি

4
FWIW, এখানে বর্ণিত ফাংশনটি এখানে আরও বিশদে আলোচনা করা হয়েছে
লুমচাইল্ড

3
এফওয়াইআই: সেই ফাংশনের বিতরণটি ভয়াবহ।
তারা

3
আমি জিএলএসএল-এ নতুন co.xy, তার পরিবর্তে কেন ব্যবহার করা হচ্ছে তা কি কেউ ব্যাখ্যা করতে পারেন co?
ক্যালিন

83

আমার কাছে এটি ঘটে যে আপনি একটি সাধারণ পূর্ণসংখ্যার হ্যাশ ফাংশন ব্যবহার করতে পারেন এবং ফলটিকে একটি ফ্লোটের ম্যান্টিসায় intoোকাতে পারেন। আইআইআরসি জিএলএসএল স্পেসটি 32-বিট স্বাক্ষরিত ইন্টিজারগুলি এবং আইইইইই বাইনারি 32 ফ্লোট প্রতিনিধিত্বের গ্যারান্টি দেয় যাতে এটি পুরোপুরি পোর্টেবল হয়।

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

একটি অসুবিধা হ'ল এটির জন্য GLSL v3.30 দরকার। এবং যদিও এটি যথেষ্ট দ্রুত বলে মনে হচ্ছে, আমি অভিজ্ঞতার সাথে এর কার্যকারিতাটির পরিমাণ নির্ধারণ করি নি। এএমডির শ্যাডার অ্যানালাইজার একটি HD5870 এ ভেক 2 সংস্করণের জন্য প্রতি ঘড়ি 13.33 পিক্সেল দাবি করে claims সিন / ফ্র্যাক্ট স্নিপেটের জন্য প্রতি ঘড়ি 16 পিক্সেলের সাথে বৈসাদৃশ্য করুন। সুতরাং এটি অবশ্যই কিছুটা ধীর।

এখানে আমার বাস্তবায়ন। আপনার নিজের ক্রিয়াকলাপগুলি এড়ানো থেকে সহজতর করার জন্য আমি এটি ধারণার বিভিন্ন ক্রিয়াকলাপে রেখেছি।

/*
    static.frag
    by Spatial
    05 July 2013
*/

#version 330 core

uniform float time;
out vec4 fragment;



// A single iteration of Bob Jenkins' One-At-A-Time hashing algorithm.
uint hash( uint x ) {
    x += ( x << 10u );
    x ^= ( x >>  6u );
    x += ( x <<  3u );
    x ^= ( x >> 11u );
    x += ( x << 15u );
    return x;
}



// Compound versions of the hashing algorithm I whipped together.
uint hash( uvec2 v ) { return hash( v.x ^ hash(v.y)                         ); }
uint hash( uvec3 v ) { return hash( v.x ^ hash(v.y) ^ hash(v.z)             ); }
uint hash( uvec4 v ) { return hash( v.x ^ hash(v.y) ^ hash(v.z) ^ hash(v.w) ); }



// Construct a float with half-open range [0:1] using low 23 bits.
// All zeroes yields 0.0, all ones yields the next smallest representable value below 1.0.
float floatConstruct( uint m ) {
    const uint ieeeMantissa = 0x007FFFFFu; // binary32 mantissa bitmask
    const uint ieeeOne      = 0x3F800000u; // 1.0 in IEEE binary32

    m &= ieeeMantissa;                     // Keep only mantissa bits (fractional part)
    m |= ieeeOne;                          // Add fractional part to 1.0

    float  f = uintBitsToFloat( m );       // Range [1:2]
    return f - 1.0;                        // Range [0:1]
}



// Pseudo-random value in half-open range [0:1].
float random( float x ) { return floatConstruct(hash(floatBitsToUint(x))); }
float random( vec2  v ) { return floatConstruct(hash(floatBitsToUint(v))); }
float random( vec3  v ) { return floatConstruct(hash(floatBitsToUint(v))); }
float random( vec4  v ) { return floatConstruct(hash(floatBitsToUint(v))); }





void main()
{
    vec3  inputs = vec3( gl_FragCoord.xy, time ); // Spatial and temporal inputs
    float rand   = random( inputs );              // Random per-pixel value
    vec3  luma   = vec3( rand );                  // Expand to RGB

    fragment = vec4( luma, 1.0 );
}

স্ক্রীনশট:

স্ট্যাটিক.ফ্রেগে র্যান্ডম আউটপুট (ভ্যাক 3)

আমি একটি চিত্র সম্পাদনা প্রোগ্রামে স্ক্রিনশটটি পরিদর্শন করেছি। এখানে 256 টি রঙ রয়েছে এবং গড় মান 127, অর্থাত্ বন্টনটি অভিন্ন এবং প্রত্যাশিত ব্যাপ্তিটি অন্তর্ভুক্ত।


17
একটি ভাল ধারণা এবং বাস্তবায়নের জন্য +1। আমি এই দাবিটি নিয়ে প্রশ্ন করব যেহেতু এখানে 256 টি রঙ এবং গড় মান 127, বন্টন অবশ্যই অভিন্ন হবে (কঠোর অর্থে)। এটি অভিন্ন হতে পারে তবে আমি এখনও এটি জানি না বলে আমি মনে করি না। উদাহরণস্বরূপ একটি বেল কার্ভ বিতরণে একই গড় এবং রঙের সংখ্যা থাকতে পারে তবে এটি অভিন্ন হবে না।
LarsH

@ লার্শ দ্বারা প্রদত্ত কারণে এটিকে ভোট দিয়েছেন।
অটোমোসলেট

ভাল, বেশিরভাগ অ্যাপ্লিকেশনগুলির জন্য এটি যথেষ্ট ভাল, যাতে অভিন্নতার প্রয়োজন হয় না । :-)
মিনিটে এটিমুক্কেল

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

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

73

গুস্তাভসনের প্রয়োগ 1 ডি টেক্সচার ব্যবহার করে uses

না এটি 2005 সালের পর থেকে নয় It's এটি কেবলমাত্র লোকেরা পুরানো সংস্করণটি ডাউনলোড করার জন্য জোর দিয়েছিল। আপনার সরবরাহিত লিঙ্কটিতে থাকা সংস্করণটি কেবলমাত্র 8-বিট 2 ডি টেক্সচার ব্যবহার করে।

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

আমাদের সক্রিয়ভাবে পরিচালিত উত্স ভান্ডারগুলি হ'ল:

https://github.com/ashima/webgl-noise

টেক্সচারলেস এবং টেক্সচার-ব্যবহারের শব্দ উভয়ের সংস্করণ এখানে (কেবলমাত্র 2 ডি টেক্সচার ব্যবহার করে):

http://www.itn.liu.se/~stegu/simplexnoise/GLSL-noise-vs-noise.zip

আপনার যদি কোনও নির্দিষ্ট প্রশ্ন থাকে তবে নির্দ্বিধায় আমাকে সরাসরি ইমেল করুন (আমার ইমেল ঠিকানা classicnoise*.glslউত্সগুলিতে পাওয়া যাবে ।)


4
হ্যাঁ, আমি যে রূপায়ণটির কথা উল্লেখ করছি, ডেভিডকর্নেট.টমে আপনার কোড যা @ লিঙ্কযুক্ত, একটি 1 ডি টেক্সচার ব্যবহার করে: glBindTexture(GL_TEXTURE_1D, *texID);ইত্যাদি "আপনি সরবরাহিত লিঙ্ক" বলতে আপনার অর্থ কী তা পরিষ্কার নয়, যেহেতু আপনি আমার উত্তর থেকে উদ্ধৃতি দিয়েছেন? কিন্তু এই উত্তরটি আপনার প্রয়োগের সাথে লিঙ্কযুক্ত নয়। আমি কী উল্লেখ করছি তা স্পষ্ট করতে আমার উত্তর আপডেট করব এবং আপনি যে নতুন তথ্য দিয়েছেন তা প্রতিবিম্বিত করব। পুরানো সংস্করণ ডাউনলোড করার জন্য "জোর" হিসাবে লোককে চিহ্নিত করা এমন একটি বিকৃতি যা আপনাকে কৃতিত্ব দেয় না।
LarsH

1
পিএস আপনি ডেভিড কর্নেটে ( ডেভিডকর্নেট.কম এ যোগাযোগের তথ্য থাকতে পারে ) লিখতে চাইতে পারেন এবং আপনার সোর্স রেপোতে লিঙ্ক করার জন্য তার ডেভিডকর্নেট . com/glsl/links.html এ তার লিঙ্কটি পরিবর্তন করতে বলুন । আমিও তাকে ইমেল করব।
LarsH

1
পিপিএস আপনি কি স্পষ্ট করতে পারেন, কোন সংস্করণটি কেবলমাত্র 8-বিট 2 ডি টেক্সচার ব্যবহার করে? মনে হচ্ছে এটি নির্দিষ্ট প্ল্যাটফর্মগুলির জন্য একটি ভাল বিকল্প হতে পারে ...
LarsH

31

সোনার শব্দ

// Gold Noise ©2015 dcerisano@standard3d.com
// - based on the Golden Ratio
// - uniform normalized distribution
// - fastest static noise generator function (also runs at low precision)

float PHI = 1.61803398874989484820459;  // Φ = Golden Ratio   

float gold_noise(in vec2 xy, in float seed){
       return fract(tan(distance(xy*PHI, xy)*seed)*xy.x);
}

এখনই আপনার ব্রাউজারে সোনার শব্দ দেখুন!

এখানে চিত্র বর্ণনা লিখুন

এই ফাংশনটি 9 ই সেপ্টেম্বর, 2017 হিসাবে @ অ্যাপ্লিকেশন উত্তরের বর্তমান ফাংশনটির তুলনায় এলোমেলো বিতরণে উন্নতি করেছে:

এখানে চিত্র বর্ণনা লিখুন

@ অ্যাপাস ফাংশনটিও অসম্পূর্ণ, এখানে কোনও বীজ সরবরাহ করা হয়নি (ইউভি বীজ নয় - প্রতিটি ফ্রেমের জন্য সমান), এবং কম নির্ভুলতা চিপসেটের সাথে কাজ করে না। স্বর্ণ নয়েস ডিফল্ট দ্বারা স্বল্প নির্ভুলতায় চলে (অনেক দ্রুত)।


এই পোস্ট করার জন্য ধন্যবাদ। আপনি কি রানডেবল সংস্করণ, যেমন shadertoy.com এ পোস্ট করার বিষয়টি বিবেচনা করবেন, যাতে লোকেরা এটি ব্রাউজারে চেষ্টা করে দেখতে পারে?
LarsH

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

7
আমি মনে করি না এটি অন্যান্য শব্দ কর্মের চেয়ে আলাদা is আপনার কী প্রমাণিত যে এর বিশেষ বৈশিষ্ট্য রয়েছে। কেবল কারণ আপনি অযৌক্তিক সংখ্যার গুচ্ছ ব্যবহার করেন এটি বিশেষ করে না।
এমকাজেম আখগারি

2
@ ডমিনিক: "এটির অনুরূপ ক্রিয়াকলাপগুলির মধ্যে এটি সর্বোত্তম বিতরণ": এটি প্রমাণিত হতে হবে। ট্যান () আসলেই অসুস্থ is উভয় টান () পাই / ২ এর নিকটবর্তী এবং শূন্যের নিকটে স্কয়ার্ট () খুব সম্ভবত বিভিন্ন হার্ডওয়্যারগুলিতে বিভিন্ন ফলাফল তৈরি করার সম্ভাবনা রয়েছে কারণ সমস্ত ফ্র্যাক্ট (অ-লিনিয়ার * বিগ) কম উল্লেখযোগ্য বিটের উপর ভিত্তি করে। ছোট বা উচ্চ ইনপুট মানগুলিও এটি প্রভাবিত করবে। এছাড়াও, স্থানগুলির উপর নির্ভর করে বিট গতিশীলতা সম্ভবত অনেকগুলি পরিবর্তিত হয়।
Fabrice NEYRET

1
এনবি: আজকাল জিএলএসএল এর পূর্ণসংখ্যা রয়েছে, সুতরাং মানের বিতরণ যখন (এবং গতিশীল) প্রয়োজন হয় তখন একই রকম পারফরম্যান্স সহ "সিরিয়াস" ইনট-বেসড হ্যাশ জেনারেটর ব্যবহার না করার কোনও কারণ নেই। (খুব নিম্ন-শেষ ডিভাইসের জন্য ব্যতীত)।
Fabrice NEYRET

12

এখানে বর্ণিত একটি দুর্দান্ত বাস্তবায়নও রয়েছে McEwan এবং @StefanGustavson যে পারলিন মত গোলমাল দেখায়, কিন্তু "কোনো সেটআপ, অর্থাত না অঙ্গবিন্যাস কিংবা অভিন্ন অ্যারে প্রয়োজন হয় না। শুধু তোমার shader সোর্স কোড থেকে এটি যোগ এবং এটি কল যেখানেই থাকুন না কেন আপনি চান"।

এটি খুব সহজ, বিশেষত গুস্তাভসনের পূর্ববর্তী বাস্তবায়ন, যা @ সংযুক্ত হয়ে গেছে, একটি 1 ডি টেক্সচার ব্যবহার করে, যা জিএলএসএল ইএস (ওয়েবজিএলের ছায়াময় ভাষা) সমর্থন করে না।


1
এটি ওপির খ) গোলমাল টাইপের অনুরোধের সেরা উত্তর! এখানে একটি সরাসরি লিঙ্ক github.com/ashima/webgl-noise । জিএলএসএল 120 ​​কোড হিসাবে 2 ডি, 3 ডি এবং 4 ডি সংস্করণ প্রস্তুত রয়েছে।
ব্যবহারকারী 362515

3

এটি ব্যবহার করুন:

highp float rand(vec2 co)
{
    highp float a = 12.9898;
    highp float b = 78.233;
    highp float c = 43758.5453;
    highp float dt= dot(co.xy ,vec2(a,b));
    highp float sn= mod(dt,3.14);
    return fract(sin(sn) * c);
}

এটি ব্যবহার করবেন না:

float rand(vec2 co){
    return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}

আপনি ওপেনজিএল ইএস 2.0 এর জন্য ক্যানোনিকাল ওয়ান-লাইনার জিএলএসএল র‌্যান্ড () এর উন্নতিতে ব্যাখ্যাটি পেতে পারেন 2.0


আমি নিবন্ধটি নিয়ে ঝাপটায় পড়েছি তবে আমি এখনও নিশ্চিত নই mod, পাই এর সমাপ্তিতে 3.14 হয় ?
কান ই।

2

জিপিইউর জন্য 3 ডি শোনার এই সংস্করণটি সবেমাত্র পাওয়া গেছে, অবশ্যই এটি দ্রুততম উপলব্ধ:

#ifndef __noise_hlsl_
#define __noise_hlsl_

// hash based 3d value noise
// function taken from https://www.shadertoy.com/view/XslGRr
// Created by inigo quilez - iq/2013
// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.

// ported from GLSL to HLSL

float hash( float n )
{
    return frac(sin(n)*43758.5453);
}

float noise( float3 x )
{
    // The noise function returns a value in the range -1.0f -> 1.0f

    float3 p = floor(x);
    float3 f = frac(x);

    f       = f*f*(3.0-2.0*f);
    float n = p.x + p.y*57.0 + 113.0*p.z;

    return lerp(lerp(lerp( hash(n+0.0), hash(n+1.0),f.x),
                   lerp( hash(n+57.0), hash(n+58.0),f.x),f.y),
               lerp(lerp( hash(n+113.0), hash(n+114.0),f.x),
                   lerp( hash(n+170.0), hash(n+171.0),f.x),f.y),f.z);
}

#endif

1
সোনার নয়েজ (উপরে) তখন স্পষ্টতই দ্রুতগতি সম্পন্ন, যেহেতু এটির অপেক্ষাকৃত কম অপারেশন রয়েছে এবং কেবল একটি হ্যাশ সম্পাদন করে - এটি একটি হ্যাশ ফ্যাকশনকে 8 বার কল করে, যখন নেস্টেড লিনিয়ার ইন্টারপোলেশনগুলি (লিটারস) সম্পাদন করে। এছাড়াও এই এক বিশেষত নিম্ন নির্ভুলতা মধ্যে নিকৃষ্ট বিতরণ আছে।
ডোমিনিক সেরিসানো

1
ওহ ভাল পয়েন্ট, এটি ইনিগো কুইলিজের শেদারটো থেকে পার্লিন শোর ধরণের গ্রাফ। চমৎকার কোড ডোমিনিক অসুস্থ এটি পরীক্ষা করুন l8r
com.prehensible

@ ফ্যাব্রিস আপনি ওপি-র প্রশ্ন, আমার উত্তর, আমার কোড বা আমার মন্তব্য বুঝতে পারছেন না বলে মনে হচ্ছে .. সোনার নয়েজ ওপিএস সংজ্ঞা অনুসারে অবিচ্ছিন্ন - এটি ইউভি এবং একটি বীজ গ্রহণ করে এবং শেডার সরবরাহ করে প্রমাণ করে। আপনার মন্তব্য সম্পর্কে সবকিছু ভুল। আপনি ছদ্ম র্যান্ডম শোনার ক্রিয়াগুলি সহ হ্যাশ ফাংশনগুলিকে বিভ্রান্ত করেন। তারা একই নয়। নয়েজ ফাংশনগুলির হ্যাশ ফাংশন (হ্যাশিংয়ের আসল পুরো পয়েন্ট) এর মতো অনন্য সনাক্তকারী তৈরি করার প্রয়োজন নেই।
ডমিনিক সেরিসানো

দয়া করে দয়া করে, ডমিনিক, আপনি যদি মনে করেন যে শর্তগুলি এমনটি না হয় তবে আপনি যে শর্তগুলি বোঝেন সেগুলি সম্পর্কে জিনিস দাবি করার আগে আরও পড়ুন এবং আরও শিখুন। এই শর্তগুলি কেবল সাহিত্যে সম্পূর্ণ নির্ভুল নয় এবং ভালভাবে সংজ্ঞায়িত করা হয়েছে, এছাড়াও আমি ক্ষেত্রের মধ্যেও কাজ করি, তবে ওপিও প্রমাণ করে যে তিনি তার পরে যে উদাহরণ দিয়েছিলেন তার দ্বারা শর্তগুলি বুঝতে পেরেছিলেন। ইঙ্গিত: "ক্রমাগত" + "শব্দ" + "পার্লিনের মতো"। en.wikipedia.org/wiki/Perlin_noise
Fabrice NEYRET

ধারাবাহিকভাবে একটি লুপ ক্লজ যুক্ত করার ক্ষেত্রে একটি মামলা রয়েছে, বিশেষত গ্রাফিক্সের জন্য বিট রাউন্ডিংয়ের কারণে অনেক শোর ফাংশন লুপ হয়ে যায় এবং একটি নির্দিষ্ট উপায়ের পরে অবনমিত হয়। আপনার কাছ থেকে এটি কেবল একটি যোগাযোগের ব্রেকসাউন শিখুন, গুরুত্বপূর্ণ গবেষণার জন্য আপনার সময়টি ব্যবহার করুন।
com. অপরিবর্তনীয়

1

1 ডি পার্লিনের একটি সোজা, জাগানো সংস্করণ, মূলত একটি এলোমেলো এলএফও জিগজ্যাগ।

half  rn(float xx){         
    half x0=floor(xx);
    half x1=x0+1;
    half v0 = frac(sin (x0*.014686)*31718.927+x0);
    half v1 = frac(sin (x1*.014686)*31718.927+x1);          

    return (v0*(1-frac(xx))+v1*(frac(xx)))*2-1*sin(xx);
}

আমি শেডারটোয়ের মালিক ইনিগো কুইলেজ পার্লিন টিউটোরিয়াল ওয়েবসাইট এবং ভোরোনাই এবং আরও অনেক কিছুতে তার কাছে 1-2 টি পূর্ণাঙ্গ বাস্তবায়ন এবং কোড পেয়েছি।


1

হ্যাশ: আজকাল ওয়েবজিএল 2.0 রয়েছে তাই (ডাব্লু) জিএলএসএল তে পূর্ণসংখ্যা পাওয়া যায়। -> মানের পোর্টেবল হ্যাশের জন্য (কুরুচিপূর্ণ ফ্লোট হ্যাশগুলির তুলনায় একই দামে) আমরা এখন "গুরুতর" হ্যাশিং কৌশল ব্যবহার করতে পারি। আইকিউ https://www.shadertoy.com/view/XlXcW4 এ আরও কিছু প্রয়োগ করেছে (এবং আরও)

উদাহরণ:

  const uint k = 1103515245U;  // GLIB C
//const uint k = 134775813U;   // Delphi and Turbo Pascal
//const uint k = 20170906U;    // Today's date (use three days ago's dateif you want a prime)
//const uint k = 1664525U;     // Numerical Recipes

vec3 hash( uvec3 x )
{
    x = ((x>>8U)^x.yzx)*k;
    x = ((x>>8U)^x.yzx)*k;
    x = ((x>>8U)^x.yzx)*k;

    return vec3(x)*(1.0/float(0xffffffffU));
}

0

রেন্ডার টেক্সচারে কীভাবে সাদা গোলমাল যুক্ত করবেন দয়া করে নীচে একটি উদাহরণ দেখুন। সমাধানটি দুটি টেক্সচার ব্যবহার করে: মূল এবং খাঁটি সাদা গোলমাল, এর মতো: উইকি সাদা শব্দ

private static final String VERTEX_SHADER =
    "uniform mat4 uMVPMatrix;\n" +
    "uniform mat4 uMVMatrix;\n" +
    "uniform mat4 uSTMatrix;\n" +
    "attribute vec4 aPosition;\n" +
    "attribute vec4 aTextureCoord;\n" +
    "varying vec2 vTextureCoord;\n" +
    "varying vec4 vInCamPosition;\n" +
    "void main() {\n" +
    "    vTextureCoord = (uSTMatrix * aTextureCoord).xy;\n" +
    "    gl_Position = uMVPMatrix * aPosition;\n" +
    "}\n";

private static final String FRAGMENT_SHADER =
        "precision mediump float;\n" +
        "uniform sampler2D sTextureUnit;\n" +
        "uniform sampler2D sNoiseTextureUnit;\n" +
        "uniform float uNoseFactor;\n" +
        "varying vec2 vTextureCoord;\n" +
        "varying vec4 vInCamPosition;\n" +
        "void main() {\n" +
                "    gl_FragColor = texture2D(sTextureUnit, vTextureCoord);\n" +
                "    vec4 vRandChosenColor = texture2D(sNoiseTextureUnit, fract(vTextureCoord + uNoseFactor));\n" +
                "    gl_FragColor.r += (0.05 * vRandChosenColor.r);\n" +
                "    gl_FragColor.g += (0.05 * vRandChosenColor.g);\n" +
                "    gl_FragColor.b += (0.05 * vRandChosenColor.b);\n" +
        "}\n";

ভাগ করা খণ্ডটিতে ইউএনওয়েস ফ্যাক্টর রয়েছে যা মূল অ্যাপ্লিকেশন অনুসারে প্রতিটি রেন্ডারিংয়ে আপডেট হয়:

float noiseValue = (float)(mRand.nextInt() % 1000)/1000;
int noiseFactorUniformHandle = GLES20.glGetUniformLocation( mProgram, "sNoiseTextureUnit");
GLES20.glUniform1f(noiseFactorUniformHandle, noiseFactor);

0

আমি কেন পার্লিনের জাভা বাস্তবায়নগুলির একটি জিএলএসএলে অনুবাদ করেছি এবং এটি শ্যাডারটয়ের কয়েকটি প্রকল্পে ব্যবহার করেছি।

নীচে আমি জিএলএসএল ব্যাখ্যাটি করেছি:

int b(int N, int B) { return N>>B & 1; }
int T[] = int[](0x15,0x38,0x32,0x2c,0x0d,0x13,0x07,0x2a);
int A[] = int[](0,0,0);

int b(int i, int j, int k, int B) { return T[b(i,B)<<2 | b(j,B)<<1 | b(k,B)]; }

int shuffle(int i, int j, int k) {
    return b(i,j,k,0) + b(j,k,i,1) + b(k,i,j,2) + b(i,j,k,3) +
        b(j,k,i,4) + b(k,i,j,5) + b(i,j,k,6) + b(j,k,i,7) ;
}

float K(int a, vec3 uvw, vec3 ijk)
{
    float s = float(A[0]+A[1]+A[2])/6.0;
    float x = uvw.x - float(A[0]) + s,
        y = uvw.y - float(A[1]) + s,
        z = uvw.z - float(A[2]) + s,
        t = 0.6 - x * x - y * y - z * z;
    int h = shuffle(int(ijk.x) + A[0], int(ijk.y) + A[1], int(ijk.z) + A[2]);
    A[a]++;
    if (t < 0.0)
        return 0.0;
    int b5 = h>>5 & 1, b4 = h>>4 & 1, b3 = h>>3 & 1, b2= h>>2 & 1, b = h & 3;
    float p = b==1?x:b==2?y:z, q = b==1?y:b==2?z:x, r = b==1?z:b==2?x:y;
    p = (b5==b3 ? -p : p); q = (b5==b4 ? -q : q); r = (b5!=(b4^b3) ? -r : r);
    t *= t;
    return 8.0 * t * t * (p + (b==0 ? q+r : b2==0 ? q : r));
}

float noise(float x, float y, float z)
{
    float s = (x + y + z) / 3.0;  
    vec3 ijk = vec3(int(floor(x+s)), int(floor(y+s)), int(floor(z+s)));
    s = float(ijk.x + ijk.y + ijk.z) / 6.0;
    vec3 uvw = vec3(x - float(ijk.x) + s, y - float(ijk.y) + s, z - float(ijk.z) + s);
    A[0] = A[1] = A[2] = 0;
    int hi = uvw.x >= uvw.z ? uvw.x >= uvw.y ? 0 : 1 : uvw.y >= uvw.z ? 1 : 2;
    int lo = uvw.x <  uvw.z ? uvw.x <  uvw.y ? 0 : 1 : uvw.y <  uvw.z ? 1 : 2;
    return K(hi, uvw, ijk) + K(3 - hi - lo, uvw, ijk) + K(lo, uvw, ijk) + K(0, uvw, ijk);
}

আমি এই উত্সটিতে কেন পার্লিনের নয়েজ হার্ডওয়্যারের দ্বিতীয় অধ্যায় থেকে পরিশিষ্ট বি থেকে অনুবাদ করেছি:

https://www.csee.umbc.edu/~olano/s2002c36/ch02.pdf

শ্যাডার খেলনাতে পোস্ট করা শোর ফাংশনটি ব্যবহার করে এমন একটি সর্বজনীন ছায়া এখানে দেওয়া হয়েছে:

https://www.shadertoy.com/view/3slXzM

আমার গবেষণার সময় আমি গোলমাল সংক্রান্ত বিষয়ে আরও কিছু ভাল উত্স পেয়েছি:

https://thebookofshaders.com/11/

https://mzucker.github.io/html/perlin-noise-math-faq.html

https://rmarcus.info/blog/2018/03/04/perlin-noise.html

http://flafla2.github.io/2014/08/09/perlinnoise.html

https://mrl.nyu.edu/~perlin/noise/

https://rmarcus.info/blog/assets/perlin/perlin_paper.pdf

https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch05.html

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

সম্পাদনা করুন:

জিএলএসএলে উপলব্ধ কিছু হার্ডওয়্যার-এক্সিলারেটড ফাংশন ব্যবহার করে অনুবাদকৃত কোডটি অনুকূলিত করতে সক্ষম হতে পারে। যদি আমি এই কাজটি শেষ না করি তবে এই পোস্টটি আপডেট করবে।


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

@ জিব্রি দুর্ভাগ্যক্রমে, আমি স্ট্রেট সি বা .sh কমান্ডের সাথে খুব বেশি পরিচিত নই। তবে দেখে মনে হচ্ছে ফাংশনটি কেবল একটি সিউডো-এলোমেলো সংখ্যা জেনারেটর এবং কোনও শোর ফাংশন নয়। এছাড়াও মনে রাখবেন যে glsl পিক্সেল শেডারগুলি সরাসরি জিপিইউতে চলে। আপনি যে সি পাওয়া হতে পারে যারা অতিরিক্ত লাইব্রেরি অথবা CPU- র ক্ষমতা কোন অ্যাক্সেস থাকবে না
অ্যান্ড্রু Meservy

গ্রিডটি স্কুইড করার কারণে এবং প্রতি পয়েন্টের তুলনায় কম প্রয়োজনীয় গণনার কারণে সিম্প্লেক্স নয়েজ কীভাবে পার্লিন নয়েজের আরও কার্যকর সংস্করণ, সে সম্পর্কে বুক অফ শেডারগুলির দুর্দান্ত ব্যাখ্যা রয়েছে। অবশ্যই পড়া মূল্যবান।
অ্যান্ড্রু মেসার্ভি

ফ্র্যাক্টাল ব্রাউনিয়ান গতি এবং ভোরোনাইজের অধ্যায়গুলিও দেখুন
অ্যান্ড্রু মেজারি

অ্যান্ড্রু মেসার্ভি: কোনও লাইব্রেরি দরকার নেই ... আমার শব্দদ্বারটি খুব সহজ: 2 64৪ বিট ইনট হ'ল রাজ্য x (n) এবং x (n-1) simple X (ঢ) + X (ঢ -1), 8)। আপনি যদি আমার গিটটি ক্লোন করে চালনা করেন তবে আপনি এটি কার্যত দেখবেন।
জিব্রি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.