XOR Doku (2004)
(lodev.org)- XOR doku, pikselin x ve y koordinatlarını XOR'layarak oluşturulan basit bir prosedürel dokudur; görüntü dosyası olmadan bir doku eşleyiciyi hızlıca test ederken kullanışlıdır
- C++'ta
^operatörüylex ^ ydeğeri üretilip RGB'ye yerleştirildiğinde gri tonlamalı bir desen oluşur; XOR, yalnızca iki bit birbirinden farklı olduğunda 1 döndürür - Doku boyutu 2'nin kuvveti olduğunda desen daha iyi görünür; 256'dan küçük boyutlarda değer aralığı dar olduğu için görüntü kararır ve renk değerleri çarpılarak telafi edilebilir
- 256'dan büyük XOR dokuları, 8 bit kanalın 0~255 renk aralığı ile sınırlı kaldığı için kalite artışı sağlamaz; daha büyük boyutlar için değer bölme ya da daha fazla bit derinliğine sahip kanallar gerekir
- Aynı koordinat tabanlı yaklaşıma
&ve|uygulanarak AND ve OR dokuları da üretilebilir; AND daha koyu, OR daha parlaktır ve XOR ile AND'nin toplamı OR eder
XOR dokunun işe yaradığı yerler
- XOR doku, üretmesi çok kolay ve görsel olarak da fena durmayan bir prosedürel dokudur
- Demo veya intro yayınlarında fazla sık kullanıldığı için iyi bir tercih değildir; oyunlarda da gösterişli zemin karoları gibi özel kullanımlar dışında pratik değeri düşüktür
- Görüntü dosyası yüklemeden veya karmaşık üretim kodu yazmadan yeni bir doku eşleyicinin çalışıp çalışmadığını hızlıca doğrulayabilirsiniz
Koordinat XOR'u ile desen üretmek
- Temel fikir, mevcut pikselin
xkoordinatı ileykoordinatını XOR'lamaktır - C++'ta XOR operatörü
^işaretidir - Örnek kod, 256×256 ekrandaki tüm pikseller için değeri hesaplar
Uint8 c = x ^ yColorRGB(c, c, c)ile gri tonlu renk ayarlanır
- Çalıştırıldığında sonuç, koordinatların bit desenlerinin birleştiği bir XOR deseni olarak görünür
Boyut ve renk aralığı kısıtları
- Doku boyutu 2'nin kuvveti olduğunda desen daha hoş görünür
- Renk bileşeni değerleri 0 ile 255 arasındadır
- XOR işlemiyle üretilen en yüksek renk değeri, doku boyutu 2'nin kuvvetiyse doku boyutuyla aynıdır
- 64 gibi 256'dan küçük desenler fazla karanlık görünür
- Renk değerini 4 ile çarparak parlaklık geri getirilebilir
- 512 gibi 256'dan büyük boyutlarda renklerin 256'yı geçmemesi için sınırlandırılması gerekir
- 256 ile mod almak mümkündür, ancak o durumda artık gerçek bir XOR deseni olmaz
- 2'ye bölmek daha iyi bir seçenektir
- 8 bit kanallarda ayırt edilebilir renk değeri yetersiz kaldığından, 256×256'dan büyük XOR dokularında kalite yükselmez
- Daha yüksek bit derinliğini destekleyen renk modlarında büyük dokuların sınırları farklı olabilir
XOR işleminin bit düzeyindeki davranışı
- XOR, iki tamsayının ikili gösterimindeki karşılık gelen bitler üzerinde işlem yapar
- Exclusive OR, iki bit farklıysa 1, aynıysa 0 döndürür
- Doğruluk tablosu şöyledir
0 XOR 0 = 00 XOR 1 = 11 XOR 0 = 11 XOR 1 = 0
- Örneğin
5 XOR 13 = 8olur- İkili olarak
0101 XOR 1101 = 1000şeklindedir
- İkili olarak
Renk varyasyonları
- XOR değeri yalnızca gri tonlamada değil, RGB'nin her kanalında farklı biçimde de kullanılabilir
- Örnekte renk,
c = x ^ ykullanılarak oluşturulurr = 255 - cg = cb = c % 128
- XOR değerini HSV renginin hue bileşeni olarak kullanıp
HSVtoRGBfonksiyonuna vermek de mümkündür- Örnekte
ColorHSV(c, 255, 255)değeriHSVtoRGBile dönüştürülerek piksel rengi olarak kullanılır
- Örnekte
AND ve OR dokuları
- XOR yerine AND ve OR operatörleri kullanılarak da benzer koordinat tabanlı dokular üretilebilir
- C++'ta AND operatörü
&, OR operatörü|işaretidir - AND, yalnızca iki bit de 1 olduğunda 1 döndürür
0 AND 0 = 00 AND 1 = 01 AND 0 = 01 AND 1 = 1
- OR, bitlerden biri ya da ikisi birden 1 ise 1 döndürür
0 OR 0 = 00 OR 1 = 11 OR 0 = 11 OR 1 = 1
- AND dokusu, 1 döndüren tek bir durum olduğu için daha koyudur; OR dokusu ise daha fazla durumda 1 döndürdüğü için daha parlaktır
- XOR dokusu ile AND dokusunun toplamı OR dokusu olur
Sonuç ve örnek kullanım
- XOR dokusu, kolay üretildiği için bir doku işleyicinin çalışıp çalışmadığını test etmede faydalıdır
- Sanatsal işler veya oyun gibi uygulamalar için uygun değildir
x ^ y ^ zbiçiminde bir 3B doku olarak da kullanılabilir; örnekte bunun, bir gezegen doku işleyicisinin doğru çalışıp çalışmadığını doğrulamak için kullanıldığı belirtilir
1 yorum
Hacker News görüşleri
Bu sayede Pacman, Snake, Space Invaders gibi retro oyunları yeniden yapabildim ve yalnızca terminalle mümkün olmayan şeyleri gerçekleştirebildim
Bence bu site, oldukça genç yaşta yazılım geliştirme kariyerine başlamamı sağlayan etkenlerden biriydi. O zamanlar https://lodev.org/cgtutor/ sitesindeki sayfaları ve örnekleri neredeyse ezbere biliyordum; matematiğin bir kısmını ise o dönemde hiç anlamamıştım
x ^ yyerineparity(x ^ y)kullanıyordum; böylece 1 bitlerin sayısı çiftse bir renge, tekse başka bir renge boyanıyordu. Neredeyse tekrar ediyor gibi görünen ama tam olarak tekrar etmeyen döşemeler gibi duruyordu, bu da görsel olarak ilginçtiEski dosyaları karıştırınca 2019'da bunu fasm ile yazdığımı ve XPM2 dosyası ürettiğini gördüm; görüntülemek için elle XPM3'e çevirmek gerekiyordu. Ortaya çıkan görsel burada: https://i.postimg.cc/FsFhXSHG/xortiles.png
İsteyen olursa kodu da paylaşabilirim ama gerçekten ilgi olur mu bilmiyorum
Xor(x,y)ise Hamming mesafesi de muhtemelenPopCount(Xor(x,y))olurduHerhalde?
Kendi blogumu usulca bırakıp geri çekiliyorum: https://nicknash.me/2012/10/26/happy-halloween/
5 4 7 6 1 0 3 2color = (y == (x ^ t))gibi bir fonksiyonda t değerini değiştirerek animasyon yaparsanız benzer bir etki elde ediyorsunuz; buna munching squares deniyorBu teknik aslında ilk olarak 1960'ların başında PDP-1 için yazılmıştı ve bunu Computer History Museum'daki PDP-1 üzerinde gösterilirken görmüştüm
PDP-1 ekranı yalnızca nokta çizebiliyor ve bitmap framebuffer kullanmıyor; buna rağmen o kendine has XOR dokusunun nasıl oluştuğunu hep merak etmiştim
Meğer olay, ekran fosforunun uzun süre parlamasından ve her noktanın parlaklığının zamanla azalmasından kaynaklanıyormuş
CHM'de çalışan bir video var ama fosfor kalıcılığı etkisini pek iyi yansıtmıyor: https://www.computerhistory.org/collections/catalog/10266415...
MAME'de çalıştırılmış video ise fosfor kalıcılığının XOR dokusunu nasıl oluşturduğunu bir ölçüde gösteriyor: https://youtu.be/AxJzUiaQ7xM?si=X9K47c4WyD6AisUp
Dwitter, canvas kullanan tek satırlık JavaScript örnekleri için Twitter benzeri bir yer ve kullanıcıların çalışmalarını 140 bayt içine sığdırması gerekiyor
Başka ikili operatörler kullanarak Sierpinski üçgeni oluşturan çeşitli türevler de var: https://www.dwitter.net/h/sierpinski
Sitenin sonlarına doğru yer alan görsellerden birindekiyle aynı gökkuşağı renk ölçeğini kullandım; oldukça benzer görünüyor ve 6 fit × 6 fit boyutlarında duvara asılı bir süs olarak duruyor
20 yıllık bir kaynak ama özellikle shader çalışması yapıyorsanız hâlâ pek çok yerde işinize yarayacak içerik barındırıyor
~:"1/~&.#:i.2^8Burada görülebilir: https://jsoftware.github.io/j-playground/bin/html2/#base64=b...