1 puan yazan GN⁺ 2024-12-19 | 1 yorum | WhatsApp'ta paylaş
  • 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üyle x ^ y değ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 x koordinatı ile y koordinatı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 ^ y
    • ColorRGB(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 = 0
    • 0 XOR 1 = 1
    • 1 XOR 0 = 1
    • 1 XOR 1 = 0
  • Örneğin 5 XOR 13 = 8 olur
    • İkili olarak 0101 XOR 1101 = 1000 şeklindedir

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 ^ y kullanılarak oluşturulur
    • r = 255 - c
    • g = c
    • b = c % 128
  • XOR değerini HSV renginin hue bileşeni olarak kullanıp HSVtoRGB fonksiyonuna vermek de mümkündür
    • Örnekte ColorHSV(c, 255, 255) değeri HSVtoRGB ile dönüştürülerek piksel rengi olarak kullanılır

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 = 0
    • 0 AND 1 = 0
    • 1 AND 0 = 0
    • 1 AND 1 = 1
  • OR, bitlerden biri ya da ikisi birden 1 ise 1 döndürür
    • 0 OR 0 = 0
    • 0 OR 1 = 1
    • 1 OR 0 = 1
    • 1 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 ^ z biç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

 
GN⁺ 2024-12-19
Hacker News görüşleri
  • Ortaokuldayken kodlamayla biraz uğraşmıştım ama yalnızca terminalde çalışan basit CLI uygulamaları yapabiliyordum; sonra bir gün Lode's Computer Graphics Tutorial'ı keşfettim ve ilk kez bir pencere açıp ekrana grafik çizen kolay örneklerle karşılaştım
    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
  • Bir zamanlar benzer bir teknikle görüntü üreten küçük bir x86 assembly programı yazmıştım; renkler 1 bittiydi
    x ^ y yerine parity(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çti
    Eski 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
  • Bu bana Hamming mesafesi dokularını hatırlatıyor: https://chalkdustmagazine.com/features/the-hidden-harmonies-...
  • Eğlenceli bir bilgi: XOR dokusundaki her nokta, onun üstünde ya da solunda görünmeyen en küçük tam sayıdır
    Kendi blogumu usulca bırakıp geri çekiliyorum: https://nicknash.me/2012/10/26/happy-halloween/
    • Örnek matriste 5 ile başlayan satır yanlış; doğrusu şöyle olmalı
      5 4 7 6 1 0 3 2
  • color = (y == (x ^ t)) gibi bir fonksiyonda t değerini değiştirerek animasyon yaparsanız benzer bir etki elde ediyorsunuz; buna munching squares deniyor
    Bu 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
  • Bunun gibi binlerce örneğin olduğu bir site var: https://www.dwitter.net/
    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
  • Bu dokuyu kullanarak bir patchwork yorgan yapmıştım
    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
  • Oldukça hoş bir site. Bir seviye yukarı çıkıp diğer sayfalara da göz atmanızı tavsiye ederim
    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
  • Yakın zamanda J dilinde bu desenle oynuyordum; şöyle ifade edilebiliyor
    ~:"1/~&.#:i.2^8
    Burada görülebilir: https://jsoftware.github.io/j-playground/bin/html2/#base64=b...
  • Az önce https://news.ycombinator.com/item?id=42414817 bağlantısını okudum; anlaşılan XOR dokusu da tesadüfen keşfedilmiş sayılıyor