أردت سديمًا في لعبة
The Last Boundary . تبدو مدهشة والمساحة بدونها ليست مساحة ، ولكنها ببساطة بكسلات بيضاء منتشرة حول الخلفية. ولكن منذ أن صنعت اللعبة بأسلوب "الفن بكسل" ، احتجت إلى أن أجعل مكتبة الضوضاء لدي تولد صورًا ذات وحدات بكسل بطريقة أو بأخرى.
فيما يلي بعض الأمثلة:
في أمثلة أحادية اللون ، يتم استخدام 8 ألوان ، وفي ألوان أخرى ، 16 لونًا. في هذه المقالة ، سأتحدث عن كيفية إنشاء سديم منقسم لـ The Last Boundary.
عندما نعمل مع مكتبة ضوضاء ، مثل
LibNoise ،
بغض النظر عن المحرك الذي تستخدمه (أو تكتب بنفسك) ، يتم توزيع القيم عادةً في النطاق من
-1
إلى
1
. من المرجح نظريًا أن تكون الضوضاء ثنائية الأبعاد في حدود
-0.7
إلى
0.7
، لكن بعض التطبيقات تقوم بتوسيع النتيجة ، وترجمتها إلى الفاصل الزمني من
-1
إلى
1
. للعمل مع القوام ثنائي الأبعاد ، يتم تحويله عادةً إلى فاصل زمني من
0
إلى
1
، ثم
RGB(255,255,255)
ضمن النطاق من
RGB(0,0,0)
إلى
RGB(255,255,255)
.
ضجيج Perlin الناتج عن إحداثي x,y
لكل بكسل تم قياسه إلى 0.3f
ثم يمكنك استخدام
الحركة البراونية الكسرية لإعطاء الصورة شعورًا بروعة الغيوم.
تعرض ضجيج بيرلين لحركة براونية كسرية مع 8
أوكتافات ، تردد 0.01
، انتظام 0.5
و lacunarity 2.0
.لقد لاحظت أن هناك الكثير من التطبيقات غير الصحيحة لضوضاء بيرلين ، والضوضاء البسيطة ، والحركة الكسرية (fBm) على الإنترنت. يبدو أن هناك الكثير من الالتباس حول ما هو. تأكد من استخدام التطبيق الصحيح ، لأنه إذا كنت تريد إنشاء السلسلة الموضحة أعلاه ، فعندئذ في حالة التطبيق غير الصحيح ، قد لا تحصل على النتائج المطلوبة.
دعونا نتخيل أننا نريد إنشاء تأثير دخاني ، أي أن مثل هذا الحل سوف يناسبنا. ولكن ستبدو لعبة الفن بكسل لدينا غريبة إذا ظهرت مجموعة كاملة من الألوان الجديدة فيها من
RGB(0,0,0)
إلى
RGB(255,255,255)
. فجأة ، سوف تظهر 255 درجة جديدة من الرمادي في اللعبة.
نحن بحاجة إلى تحويلها إلى عدد محدود من الألوان. هذا هو ما سنفعله لاحقا. في هذه الأثناء ...
توليد سديم عشوائي
كررت دروسًا جاهزة حول توليد سديم عشوائي ، لكنني أضفت بعضًا من خطواتي وطبقت مكتبة الضوضاء الخاصة بي. لقد كتبت ذلك قبل بضع سنوات لأنني أردت أن أفهم جيدًا ضوضاء بيرلين وكيف يمكنك استخدامها مع مفاهيم أخرى لإنشاء نسيج وما شابه.
ربما يمكنك تكرار ورائي خطوة بخطوة أو سيتعين عليك إجراء إضافات على الكود الذي سيؤثر على ضوضاءك. سأشرح كل شيء باستثناء توليد الضوضاء الأولي و fBm بحيث يمكنك كتابة الكود بنفسك ؛ أعتقد أنه يمكن افتراض أن لديك بالفعل القدرة على توليد الضوضاء و fBm.
للبدء ، سأظهر نتيجة توليد السديم:
النتيجة النهائيةمن المهم أن نلاحظ أنه لم يتم تقسيمها بعد. لديها مجموعة كاملة من الألوان مع سماء نجمية منقطة. السديم سنقوم بالبكسل لاحقًا.
أول شيء فعله هو توليد خمسة أشكال مختلفة: الأحمر والأخضر والأزرق والألفا والقناع. هناك حاجة إلى القوام الأحمر والأخضر والأزرق لقنوات الألوان النهائية المقابلة. في الحقيقة ، لا أقوم إلا بإنشاء قناة ملونة أو اثنتين ، لأنه تبين أن استخدام الثلاثة ينتج سديم ملون بشكل لا يصدق يبدو قبيحًا. أي لون واحد أو مزيج من لونين سوف تبلي بلاء حسنا.
تعتبر قناة ألفا مهمة لأنها تعتمد عليها فيما إذا كانت النجوم السفلية ستتألق عبر السديم. سأوضح ذلك من خلال عرض قناة ألفا في المثال الموضح أعلاه.
استعداد قناة ألفا من مثالناكلما كانت المنطقة أكثر بياضا ، كلما كانت القيمة أقرب إلى
1.0
، مما يعطينا قيمة ألفا هي
255
. كلما كانت المنطقة أكثر سوادًا ، كانت أكثر شفافية. إذا نظرت إلى مثال ، يمكنك أن ترى أن المساحات السوداء تتوافق مع المناطق التي تكون فيها السماء المرصعة بالنجوم مرئية.
سماء نجمية سبيل المثالهذه ليست نفس النجوم كما في المثال ، لأنه يتم إنشاؤها بشكل عشوائي في كل لقطة شاشة. آمل أن لا يمنعك هذا من فهم كيفية توليد السديم.
تتكون مكتبة الضوضاء الخاصة بي من وحدات ، تتبع مثال
Lib Noise . كل شيء في هذه المكتبة هو "وحدات" يمكن ربطها معًا. تقوم بعض الوحدات بإنشاء قيم جديدة (Perlin Module ، و Constant Value) ، والبعض الآخر يربطها (Multiply ، Add) ، والبعض الآخر يؤدي عمليات على القيمة (Lerp ، Clamp).
قنوات اللون
لا يهم إذا عملنا بلون واحد أو اثنين أو ثلاثة ألوان - يتم إنشاء القنوات الأحمر والأخضر والأزرق بنفس الطريقة ؛ أنا فقط استخدام قيمة البذور مختلفة بالنسبة لهم. تعتمد القيم الأولية الخاصة بي على وقت النظام الحالي.
أدناه ، يتم تقديمها جميعًا بتدرج تدرج الرمادي ، لكن من الناحية النظرية ، فهي ببساطة قيم لأحد القنوات الثلاث. تدرج الرمادي هنا فقط لتوضيح النتائج.
1. ضجيج بيرلين
كما ذكر أعلاه ، فإن ضوضاء بيرلين ستكون نقطة الانطلاق. إذا كنت تريد ، يمكنك استخدام ضوضاء بسيطة ، يبدو أن تنفيذها ثنائي الأبعاد لا ينتمي إلى كين بيرلين ، لكن قد أكون مخطئًا. من وجهة نظر رياضية ، تستخدم ضوضاء البساطة البسيط تعليمات أقل ، وبالتالي فإن توليد سديم مماثل سيكون أسرع. نظرًا لأنه يستخدم simplexes بدلاً من الشبكة ، فإنه يخلق ضوضاء أكثر جمالًا بقليل ، لكننا لن نعمل معها كثيرًا ، لذلك هذا ليس مهمًا بشكل خاص.
لا يتم عرض الكود الحقيقي أدناه ، لأنه في المصادر الحقيقية تم تغيير قيم
x,y
بواسطة fBm في الخطوة 3. هذا هو فقط إحداثي
x,y
للصورة مضروبة في عامل القياس الثابت.
ضجيج Perlin الناتج عن إحداثي x,y
لكل بكسل تم قياسه إلى 0.3f
. أي PixelValue = PerlinNoise(x * 0.3f, y * 0.3f)
تكون القيم التي تم إنشاؤها بواسطة ضوضاء Perlin في النطاق من
-1
إلى
1
، لذا لإنشاء الصورة ذات الدرجات الرمادية المعتادة الموضحة أعلاه ، نقوم بتحويلها إلى الفاصل الزمني من
0
إلى
1
. لقد اختبرت نطاق القيم بحيث ينتج عن التحويل أكبر تباين (أقل قيمة تقابل
0
، أكبر -
1
).
2. الضرب
الوحدة التالية المستخدمة تضاعف الضوضاء الناتجة بنسبة
5
. ويمكن اعتبار هذا تعديل التباين. القيم السالبة أغمق ، والقيم الإيجابية أفتح.
ليس لدي شيء لإظهاره هنا ، لأنه في عملية تحويل القيم من الفاصل الزمني من
-5
إلى
5
إلى الفاصل الزمني من
0
إلى
1
لا تتغير النتيجة.
3. الحركة البراونية الكسرية (fBM)
تحول هذه المرحلة الضوضاء إلى ما يعتبره الكثير من الناس "تأثيرًا حقيقيًا للضوضاء". نحن هنا نقوم بتنفيذ أوكتافات من العينات الأصغر بشكل متزايد من وظيفة الضوضاء (في حالتنا ، تكون الدالة
perlin(x,y)
) لإضافة تقلبات.
حركة براونية كسرية لضوضاء بيرلين الموضحة أعلاه. 8
أوكتافات ، تردد .01f
، انتظام .5f
و 2.5f
يمكنك بالفعل رؤية أصل شيء مثير للاهتمام. لا يتم إنشاء الصورة الموضحة أعلاه عن طريق تحجيم إحداثيات
x,y
بكسل ، fBM يفعل هذا. مرة أخرى ، يتم تحويل هذه القيم بشكل عكسي إلى فاصل زمني من
0
إلى
1
إلى فاصل زمني ممكن من
-5
إلى
5
.
4. تقييد (المشبك)
الآن سأقصر القيم على نطاق من
-1
إلى
1
. سيتم تجاهل أي شيء خارج هذا الفاصل بالكامل.
نفس fBm ، يقتصر على -1
إلى 1
تتمثل مهمة هذه العملية في تحويل القيم إلى فاصل زمني أقصر أثناء إنشاء تدرجات أكثر وضوحًا وزيادة المساحة باللون الأبيض أو الأسود الكامل. هذه المناطق الميتة أو الفارغة مهمة لتأثير السديم ، والتي سنتناولها لاحقًا. إذا لم نقم بضرب
5
في البداية ، فلن يتسبب المشبك في تغيير أي شيء.
5. أضف 1
الآن نأخذ القيم من clamp ونضيف 1. لهم ، وبالتالي ، فإننا ننقل القيم إلى الفاصل الزمني من
0
إلى
2
. بعد التحويل ، ستبدو النتائج كما كانت من قبل.
6. القسمة على 2
ربما تعرف ماذا سيحدث عندما أقسم النتيجة على
2
(اضرب في
.5
). في الصورة ، لن يتغير شيء مرة أخرى.
الخطوتين 5 و 6 تحويل القيم إلى نطاق من
0
إلى
1
.
7. إنشاء نسيج تشويه
والخطوة التالية هي إنشاء نسيج التشويه. سأفعل ذلك مع ضوضاء Perlin (مع القيمة الأولية الجديدة)> اضرب في 4> نفذ fBm. في هذه الحالة ، يستخدم fBm
5
أوكتافات ، بتردد قدره
0.025
، وانتظام
0.5
وراعي
1.5
.
تشويه الملمسهناك حاجة إلى هذا الملمس من أجل إنشاء تفاصيل أكثر من الملمس الموجود في السديم. السديم عبارة عن سحابة متموجة كبيرة إلى حد ما ، وهذا الملمس سوف يحدث تغييرات بسيطة عليه. من خلالها ، ستبدأ الطبيعة الشبكية لضوضاء بيرلين في الظهور.
8. إزاحة نسيج اللون باستخدام نسيج الإزاحة
بعد ذلك ، سوف آخذ هاتين القوتين وأستخدم أحدهما لتعويض إحداثيات الآخر بعامل. في حالتنا ، تبدو المجموعة كما يلي:
نتيجة التحيزيتم استخدام نسيج التشويه لتغيير إحداثيات
x,y
التي نبحث عنها في بيانات الضوضاء المصدر.
تذكر أن الصور المعروضة أعلاه هي لأغراض التوضيح فقط. في كل مرحلة ، لدينا في الواقع سوى وظيفة الضوضاء. نقوم بتمريرها القيمة
x,y
، وتقوم بإرجاع رقم. في مراحل معينة ، قد يكون الفاصل الزمني لهذا الرقم مختلفًا ، لكننا قمنا بتحويله مرة أخرى إلى تدرج الرمادي لإنشاء صورة. يتم إنشاء الصورة باستخدام كل
x,y
إحداثي الصورة كما
x,y
، تنتقل عن طريق وظيفة الضوضاء.
هذا هو ، عندما نقول:
أعطني قيمة بكسل الزاوية العليا اليسرى بعلامة X = 0 و Y = 0
وظيفة ترجع لنا عددا. إذا طلبنا من بيرلين ذلك ، فنحن نعرف أنه سيكون بين
-1
و
1
، كما ذكر أعلاه ، لقد طبقنا clamp والإضافة والضرب ، نحصل على قيمة بين
0
و
1
.
بعد أن فهمنا ذلك ، علمنا أن وظيفة تشويه الضوضاء تخلق قيمًا في المدى من
-1
إلى
1
. لذلك ، لأداء التحيز عندما نقول:
أعطني قيمة البيكسل في الركن الأيسر العلوي مع البكسل X = 0 و Y = 0
تطلب وحدة الإزاحة أولاً وظيفة الإزاحة للإحداثيات
x,y
. نتيجة هذا بين
-1
و
1
(كما كان أعلاه). ثم مضروبة في
40
(هذا هو
المعامل الذي اخترته). ستكون النتيجة قيمة بين
-40
و
40
.
ثم نأخذ هذه القيمة ونضيفها إلى الإحداثيات إلى
x,y
التي كنا نبحث عنها ، ونستخدم هذه النتيجة للبحث عن نسيج اللون. لقد قمنا بقطع القيم السالبة باستخدام clamp على 0 ، لأنه من المستحيل البحث عن إحداثيات
x,y
سالبة في وظائف الضوضاء (على الأقل في مكتبة الضوضاء الخاصة بي).
وهذا بشكل عام يبدو كالتالي:
ColourFunction(x,y) = 0 1 DisplaceFunction(x,y) = -1 1 DoDisplace(x,y) = { v = DisplaceFunction(x,y) * factor clamp(v,0,40) x = x + v; y = y + v; if x < 0 then x = 0 if y < 0 then y = 0 return ColourFunction(x,y) }
أتمنى أن تفهم هذا. في الواقع ، نحن لا ننظر إلى
x,y
التي كنا فيها ، ولكن في الإزاحة. وبما أن
الحجم هو أيضًا تدرج سلس ، فإنه يتحول بسلاسة.
هناك طرق أخرى لأداء الإزاحة. تحتوي مكتبة الضوضاء الخاصة بي على وحدة نمطية تؤدي إلى إزاحة لولبية. يمكن استخدامه لرسم الملمس ، بالتناقص التدريجي إلى عدد من النقاط.
هنا مثال .
هذا كل شيء. نكرر العمليات المذكورة أعلاه ثلاث مرات ، باستخدام قيم أولية جديدة لكل قناة ملونة. يمكنك إنشاء قناة أو قناتين. لا أعتقد أن الأمر يستحق إنشاء الثلث.
قناة ألفا
يتم إنشاء قناة ألفا بنفس طريقة إنشاء قنوات الألوان:
- نبدأ مع ضجيج بيرلين
- اضرب ب
5
- fBM مع
8
أوكتافات ، تردد 0.005
، انتظام 0.5
و lacunarity 2.5
- نحن نحصر النتائج باستخدام Clamp على الفاصل الزمني من
-1
إلى 1
، ونضيف 1
، ونقسم على 2
(أي ، نحول الفاصل الزمني من -1
إلى 1
إلى الفاصل الزمني من 0
إلى 1
. - نحول النتيجة بمقدار صغير في الاتجاه السلبي. أنا قابلتها
0.4
. بفضل هذا ، يصبح كل شيء أغمق قليلاً. - نحن نقتصر النتائج على فاصل زمني من
0
إلى 1
. نظرًا لأننا قمنا بنقل كل شيء ، مما جعله أغمق قليلاً ، في الواقع ، أنشأنا المزيد من المساحات ب 0
، وبعض المناطق دخلت في قيم سالبة.
والنتيجة هي نسيج قناة ألفا.
نسيج ألفاكما قلت ، فإن المساحات السوداء ستكون شفافة ، والمساحات البيضاء ستكون معتمة.
أقنعة القناة
هذا هو الملمس الأخير الذي يتم استخدامه لإنشاء الظلال المتراكبة فوق كل شيء آخر. يبدأ تماما مثل جميع القوام:
- الضوضاء بيرلين
- اضرب ب
5
- نقوم بإجراء fBm ،
5
أوكتافات ، تردد 0.01
، انتظام 0.1
، lacunarity 0.1
. انتظام صغير ، لذلك السحابة أقل كثافة - إجراء تحول فاصل من
-1
إلى 1
إلى فاصل من 0
إلى 1
لكننا نخلق اثنين من هذه القوام:
قناع أقناع بنكشف هذه القوام اثنين لما أسميه وحدة
اختيار . في الواقع ، نحن نستخدم القيمة من الوحدة A أو الوحدة B. يعتمد الخيار على قيمة الوحدة النمطية C. ويتطلب قيمتين أخريين -
حدد Point and
Falloff .
إذا كانت القيمة عند النقطة
x,y
للوحدة C أكبر من أو تساوي
SelectPoint
، فإننا نستخدم القيمة عند النقطة
x,y
للوحدة B. إذا كانت القيمة أقل من أو تساوي
SelectPoint - Falloff
، فإننا نستخدم القيمة في
x,y
للوحدة A.
إذا كانت بين
SelectPoint - Falloff
و
SelectPoint
، فإننا نقوم بإجراء الاستيفاء الخطي بين
x,y
قيم الوحدة A
SelectPoint
B.
float select(x, y, moduleA, moduleB, moduleC, selectPoint, falloff) { float s = moduleC(x,y); if(s >= selectPoint) return moduleB(x,y); else if(s <= selectPoint - falloff) return moduleA(x,y); else { float a = moduleA(x,y); float b = moduleB(x,y); return lerp(a, b, (1.0 / ((selectPoint - (selectPoint-falloff)) / (selectPoint - s))); } }
في حالتنا ، الوحدة A هي وحدة
ثابتة بقيمة
0
. الوحدة ب هي أول نسيج للقناع A ،
والقائم (الوحدة C) هو القناع الثاني لـ B.
SelectPoint
سيكون
0.4
، وستكون
Falloff
0.1
. نتيجة لذلك ، نحصل على:
قناع النهائيبزيادة أو تقليل
SelectPoint
، نقوم بتقليل أو زيادة مقدار اللون الأسود في القناع. عن طريق زيادة أو تقليل
falloff
، نقوم بزيادة أو تقليل الحواف الناعمة للأقنعة. بدلاً من أحد الأقنعة ، يمكنني استخدام الوحدة النمطية "
ثابت " بقيمة
1
، لكنني أردت إضافة القليل من العشوائية إلى المناطق "غير المقنعة".
مزيج قناة اللون وقناع
نحتاج الآن إلى تطبيق قناع على كل قناة من القنوات الملونة. يتم ذلك باستخدام وحدة
المزج . فهو يجمع بين النسب المئوية للقيم من وحدتين بحيث يكون مجموع القيم 100٪.
وهذا يعني أننا يمكن أن نأخذ 50٪ من القيمة في
x,y
للوحدة A و 50٪ من القيمة في
x,y
للوحدة B. أو 75٪ و 25٪ ، إلخ. تعتمد النسبة المئوية التي نأخذها من كل وحدة نمطية على وحدة نمطية أخرى - الوحدة النمطية C. إذا كانت القيمة في
x,y
للوحدة C هي
0
، فسنأخذ 100٪ من الوحدة A و 0٪ من الوحدة ب. إذا كانت
1
، فإننا نأخذ القيم العكسية.
الجمع بين كل لون الملمس.
- الوحدة (أ) - قيمة ثابتة 0
- الوحدة ب هي القناة الملونة التي رأيناها بالفعل
- الوحدة النمطية C - قناع النتيجة
هذا يعني أنه سيتم عرض ضوضاء قناة اللون فقط عندما يكون للقناع قيم أعلى من
0
(مساحات أقرب إلى اللون الأبيض) ، ويعتمد حجم رؤيتها على قيمة القناع.
هذه هي النتيجة لمثالنا:
النتيجة النهائيةقارن هذا بالأصل قبل تطبيق المزج بقناع.
قبل الاختلاط مع قناعربما لا يكون هذا المثال واضحًا للغاية ، ولكن نظرًا للفرصة ، يصعب تحديد مثال جيد على وجه التحديد. تأثير القناع هو إنشاء مناطق أكثر قتامة. بالطبع ، يمكنك تخصيص القناع بحيث تكون أكثر وضوحًا.
من المهم هنا أن يتم تطبيق نفس القناع على قناة اللون بأكملها ، أي أن نفس المساحات تظهر في الظل.
نحن نجمع كل شيء معًا
مثالنا النهائي الأولي:
مثال جاهزيستخدم قنوات Red و Green و Alpha:
قناة حمراءقناة خضراءقناة ألفاثم وضعناهم فوق سماءنا المرصعة بالنجوم.
يبدو كل شيء جيدًا الآن ، ولكنه غير مناسب جدًا للعبة بكسل الفنية. نحن بحاجة إلى تقليل عدد الألوان ...
خفض المتوسط
يمكن تطبيق هذا الجزء من المقالة على أي شيء. لنفترض أنك تولِّد نسيجًا رخاميًا وتريد تقليل عدد الألوان. هذا هو المكان الذي تأتي فيه خوارزمية القطع المتوسطة في متناول يدي. سنستخدمه لتقليل عدد الألوان في السديم الموضح أعلاه.
يحدث هذا
قبل تراكبه في السماء المرصعة بالنجوم. عدد الألوان هو تعسفي تماما.
خوارزمية Median Cut كما هو موضح في ويكيبيديا:
افترض أن لدينا صورة تحتوي على عدد عشوائي من وحدات البكسل ونريد إنشاء لوحة من 16 لونًا. ضع كل وحدات البكسل في الصورة (أي قيم RGB الخاصة بها) في المهملات . تعرف على أي قناة لون (أحمر أو أخضر أو أزرق) بين جميع وحدات البكسل في السلة التي تحتوي على أكبر مجموعة من القيم ، ثم قم بترتيب وحدات البكسل وفقًا لقيم هذه القناة. على سبيل المثال ، إذا كان للقناة الزرقاء أكبر مجموعة من القيم ، فإن البيكسل بقيمة RGB (32 ، 8 ، 16) أصغر من البيكسل مع قيمة RGB (1 ، 2 ، 24) ، لأن 16 <24. بعد فرز السلة ، ضع النصف العلوي من البيكسل في سلة جديدة. (أعطت هذه الخطوة الاسم لخوارزمية القطع المتوسطة ؛ تقسم السلال إلى النصف بمتوسط قائمة البكسل.) كرر العملية لكل من السلالتين ، والتي ستمنحنا 4 سلال ، ثم كرر لجميع سلال 4 ، ثم حصلت على 8 سلال ، ثم كررنا لـ 8 سلال سلال. نقيم وحدات البكسل في كل من السلال ونحصل على لوحة من 16 لونًا. نظرًا لأن عدد السلال يتضاعف في كل تكرار ، فإن الخوارزمية يمكنها فقط إنشاء مثل هذه اللوحات ، وعدد الألوان التي تمثل قوة اثنين . على سبيل المثال ، لإنشاء لوحة ذات 12 لونًا ، يلزمك أولاً إنشاء لوحة ذات 16 لونًا ، ثم دمج بعض الألوان بطريقة أو بأخرى.
المصدر: https://en.wikipedia.org/wiki/Median_cut
بدا لي هذا التفسير سيئًا وليس مفيدًا بشكل خاص. عند تنفيذ الخوارزمية ، يتم الحصول على صور بشعة بهذه الطريقة. لقد طبقتها مع بعض التغييرات:
- نقوم بتخزين حاوية
boxes
جنبًا إلى جنب مع القيمة التي تشير إلى الفاصل الزمني (المزيد حول هذا أدناه). يقوم box
ببساطة بتخزين عدد ديناميكي من البكسل من الصورة الأصلية. - أضف جميع البيكسلات من الصورة الأصلية
أول واستخدم الفاصل الزمني 0
- على الرغم من أن إجمالي عدد
أقل من عدد الألوان المطلوب ، إلا أننا نواصل الخطوات التالية. - إذا كانت قيمة الفاصل الزمني تساوي
0
، فعند كل مربع حالي ، نحدد قناة اللون الرئيسية في هذا box
، ثم نرتب البيكسلات في هذا box
حسب هذا اللون. — Red, Green, Blue Alpha, . , redRange = Max(Red) - Min(Red)
. , . box
boxes
. , box
.- , 4 5
box
, boxes
. , , , . , , . box
( == ) boxes
. 0
( ). , , , — . .
, , , , . , , .
, . RGB, .
.
Median Cut 16, 16 . , -, . , . median cut, ( ), .
16 2box
, . . , . , , . 1, 2 3 . 16 , 13 .
, . . .
, (dithering), -. , , .
- . . . :
16 :
16-: