XOR टेक्सचर (2004)
(lodev.org)- XOR टेक्सचर एक सरल procedural texture है, जिसे pixel के x, y coordinates को XOR करके बनाया जाता है। image file के बिना texture mapper को जल्दी टेस्ट करने के लिए यह उपयोगी है
- C++ में
^operator सेx ^ yvalue बनाई जाती है और इसे RGB में डालने पर grayscale pattern बनता है। XOR तभी 1 लौटाता है जब दो bits एक-दूसरे से अलग हों - texture size 2 की power हो तो pattern बेहतर दिखता है। 256 से छोटे size में value range संकरी होने से यह गहरा दिखता है, जिसे color values को multiply करके सुधारा जा सकता है
- 256 से बड़े XOR texture में 8-bit channel की 0~255 color range सीमा बन जाती है, इसलिए quality नहीं बढ़ती। बड़े size के लिए value division या अधिक bit channels की जरूरत होती है
- इसी coordinate-based तरीके में
&और|लगाने से AND, OR textures भी बनाए जा सकते हैं। AND ज्यादा dark और OR ज्यादा bright होता है, और XOR व AND का sum OR होता है
XOR टेक्सचर कहाँ काम आ सकता है
- XOR टेक्सचर बनाना बहुत आसान है और visually भी ठीक-ठाक दिखने वाला procedural texture है
- demo या intro releases में इसका बहुत ज्यादा इस्तेमाल हो चुका है, इसलिए यह अच्छा choice नहीं है। games में भी flashy floor tiles जैसे use case के अलावा इसकी practical उपयोगिता कम है
- image file load किए बिना या complex generation code लिखे बिना, नया texture mapper काम कर रहा है या नहीं, यह जल्दी check किया जा सकता है
coordinate XOR से pattern बनाना
- basic idea मौजूदा pixel के
xcoordinate औरycoordinate को XOR करना है - C++ में XOR operator
^है - example code 256×256 screen के हर pixel के लिए value calculate करता है
Uint8 c = x ^ yColorRGB(c, c, c)से grayscale color set करता है
- run result coordinates के bit patterns के combine होने से बने XOR pattern के रूप में दिखता है
size और color range की सीमाएँ
- texture size 2 की power हो तो pattern बेहतर दिखता है
- color component values 0 से 255 तक होती हैं
- XOR operation से बनने वाली maximum color value, texture size 2 की power होने पर, texture dimension के बराबर होती है
- 64 जैसे 256 से छोटे patterns बहुत dark दिखते हैं
- color value को 4 गुना multiply करने से brightness वापस लाई जा सकती है
- 512 जैसे 256 से बड़े size में color को 256 से ऊपर न जाने देने के लिए limit करना पड़ता है
- 256 से modulo operation किया जा सकता है, लेकिन तब वह असली XOR pattern नहीं रह जाता
- 2 से divide करना बेहतर है
- 8-bit channel में अलग पहचानी जा सकने वाली color values कम होती हैं, इसलिए 256×256 से बड़े XOR textures की quality नहीं बढ़ती
- यदि color mode ज्यादा bit depth support करता है, तो बड़े textures की सीमा अलग हो सकती है
XOR operation का bit behavior
- XOR दो integers के binary representation में corresponding bits पर operation करता है
- Exclusive OR दो bits अलग हों तो 1, समान हों तो 0 लौटाता है
- truth table इस प्रकार है
0 XOR 0 = 00 XOR 1 = 11 XOR 0 = 11 XOR 1 = 0
- उदाहरण के लिए
5 XOR 13 = 8है- binary में यह
0101 XOR 1101 = 1000है
- binary में यह
color variations
- XOR value को केवल grayscale ही नहीं, बल्कि RGB के हर channel पर अलग तरह से apply किया जा सकता है
- example में
c = x ^ yका इस्तेमाल करके color बनाया जाता हैr = 255 - cg = cb = c % 128
- XOR value को HSV color के hue के रूप में इस्तेमाल करके
HSVtoRGBfunction में भी डाला जा सकता है- example में
ColorHSV(c, 255, 255)कोHSVtoRGBसे convert करके pixel color के रूप में इस्तेमाल किया गया है
- example में
AND और OR textures
- XOR की जगह AND और OR operators इस्तेमाल करके भी मिलते-जुलते coordinate-based textures बनाए जा सकते हैं
- C++ में AND operator
&, OR operator|है - AND तभी 1 लौटाता है जब दोनों bits 1 हों
0 AND 0 = 00 AND 1 = 01 AND 0 = 01 AND 1 = 1
- OR तब 1 लौटाता है जब दोनों में से कोई एक या दोनों 1 हों
0 OR 0 = 00 OR 1 = 11 OR 0 = 11 OR 1 = 1
- AND texture ज्यादा dark होता है क्योंकि 1 लौटाने का case सिर्फ एक है, और OR texture ज्यादा bright होता है क्योंकि 1 लौटाने के cases ज्यादा हैं
- XOR texture और AND texture का sum OR texture बनता है
निष्कर्ष और example उपयोग
- XOR texture बनाना आसान है, इसलिए texture renderer काम कर रहा है या नहीं यह test करने में उपयोगी है
- art work या games जैसी applications के लिए यह suitable नहीं है
- इसे
x ^ y ^ zform के 3D texture के रूप में भी इस्तेमाल किया जा सकता है, और example में planet texture renderer सही से काम कर रहा है या नहीं, यह check करने के लिए इसका इस्तेमाल हुआ है
1 टिप्पणियां
Hacker News की रायें
इसकी वजह से मैं Pacman, Snake, Space Invaders जैसे retro games फिर से बना पाया, और वे काम संभव हुए जो सिर्फ़ terminal से नहीं हो सकते थे
मुझे लगता है यह site काफ़ी कम उम्र में software development career शुरू करने की वजह बनी। उस समय मैं https://lodev.org/cgtutor/ के pages और examples लगभग रट चुका था, और maths के कुछ हिस्से तब बिल्कुल समझ नहीं आते थे
x ^ yकी जगहparity(x ^ y)इस्तेमाल किया था: अगर 1-bits की संख्या even हो तो एक color, odd हो तो दूसरा color। यह visually दिलचस्प था, क्योंकि यह लगभग repeat होता हुआ, लेकिन पूरी तरह repeat न होने वाली tiling जैसा दिखता थापुराने files खंगाले तो पता चला कि इसे 2019 में fasm से लिखा था और यह XPM2 file generate करता था, जिसे देखने के लिए manually XPM3 में convert करना पड़ता था। Result image यहाँ है: https://i.postimg.cc/FsFhXSHG/xortiles.png
चाहें तो code भी डाल सकता हूँ, लेकिन पता नहीं किसी को ख़ास दिलचस्पी होगी या नहीं
Xor(x,y)है, तो Hamming distance शायदPopCount(Xor(x,y))होगाशायद?
अपना blog चुपके से छोड़ते हुए भागता हूँ: https://nicknash.me/2012/10/26/happy-halloween/
5 4 7 6 1 0 3 2color = (y == (x ^ t))जैसी function से t की value बदलते हुए animation करें तो similar effect आता है, जिसे munching squares कहा जाता हैमूल रूप से यह 1960s की शुरुआत में PDP-1 के लिए लिखा गया था, और मैंने इसे Computer History Museum के PDP-1 पर demo होते देखा है
PDP-1 display सिर्फ़ points plot कर सकता है और bitmap framebuffer इस्तेमाल नहीं करता, तो मैं हमेशा सोचता था कि इसकी खास XOR texture कैसे बनती है
पता चला कि यह screen phosphor की लंबी persistence का फायदा उठाता है, और हर point की brightness समय के साथ घटती है
CHM पर चलने का video है, लेकिन phosphor persistence effect अच्छी तरह capture नहीं होता: https://www.computerhistory.org/collections/catalog/10266415...
MAME में चलाए गए video में कुछ हद तक दिखता है कि phosphor persistence XOR texture कैसे बनाती है: https://youtu.be/AxJzUiaQ7xM?si=X9K47c4WyD6AisUp
Dwitter canvas इस्तेमाल करने वाली one-line JavaScript examples के लिए Twitter जैसी जगह है, और users को अपना काम 140 bytes के भीतर रखना होता है
दूसरे binary operators इस्तेमाल करके Sierpinski triangle बनाने वाले कई variations भी हैं: https://www.dwitter.net/h/sierpinski
site के आख़िरी हिस्से की images में से एक जैसी rainbow color scale इस्तेमाल की, इसलिए यह काफ़ी मिलता-जुलता दिखता है, और 6 feet × 6 feet की decoration के रूप में दीवार पर टंगा है
material 20 साल पुराना है, लेकिन खासकर अगर आप shader work करते हैं, तो इसमें आज भी कई जगह काम आने वाली चीज़ें हैं
~:\"1/~&.#:i.2^8यहाँ देखा जा सकता है: https://jsoftware.github.io/j-playground/bin/html2/#base64=b...