Psychedelic Graphics 0: Giriş
(benpence.com)- Psychedelic animasyon ve oyun görselleri üretmek için bir giriş niteliğinde; ön bilgi gerektirmeden takip edilebilmesi için UV ve renk hesaplamalarından başlıyor
- 3D modellere renk vermenin özü, 2D görüntü alanlarını 3D yüzeylere bağlayan UV mapping/texture mapping kavramını anlamaktır
- UV koordinatları, texture üzerindeki konumu gösteren 0.0–1.0 aralığında iki değerdir;
(0.5, 1.0)yatayda %50, dikeyde %100 noktasına karşılık gelir - Grafiklerde renkler genellikle üç RGB değeriyle ifade edilir; UV’nin X ve Y değerleri kırmızı ve yeşile dönüştürülürse koordinat değişimi renk gradyanı olarak görünür
- Örnek kod, tüm ekranı kaplayan tek bir 3D yüzeyde piksel başına bağımsız hesaplama ile rengi belirlediğinden, alışılmış program yazma biçiminden farklı bir düşünme tarzı gerektirir
Serinin hedefi ve varsayımları
- Psychedelic Graphics serisi, animasyonlarda ve oyunlarda kullanılabilecek psychedelic görseller üretme yöntemlerini ele alır
- Grafik veya programlama ön bilgisi gerektirmez; ancak trigonometri ve programlama deneyimi anlamayı kolaylaştırır
- Amaç, video örneğinde kullanılan psychedelic grafiklerin temel ilkelerini öğrenmektir
- Videoların büyük kısmı Blender ile yapılmıştır, ancak bu serideki teknikleri başka ortamlara taşımak kolaydır; Blender part 3’te ele alınır
- Bölüm 0 ve part 1, web üzerinde çalışan örneklere doğru ilerler
3D modeller ve UV mapping
-
3D modeller nokta ve yüzeylerden oluşan yüzeylerdir
- Bilgisayar grafikleri 3D gibi görünür, ancak grafik kodu yazarken çoğu zaman 2D düşünmek gerekir
- Bir 3D düzenleme programında model oluşturduğunuzda, aslında uzayda duran noktalar olan vertex’ler (vertices) ve bu vertex’leri bağlayan yüzeyler (faces) oluşturursunuz
- Model içi boş bir yüzeydir; ekranda görünen şey yalnızca yüzeydir
- Oyun ve animasyonlardaki neredeyse tüm 3D biçimler bu nokta ve yüzeylere indirgenir
- Pürüzsüz görünen modellerde de çoğu zaman sınırları ayırt etmeyi zorlaştıracak kadar çok nokta ve yüzey bulunur
-
Texture, 3D yüzeye uygulanacak 2D görüntüdür
- 3D yüzeylere renk eklemenin standart yolu olarak UV mapping/texture mapping kullanılır
- Dünya’nın 2D projeksiyon haritasında bazı bölgelerin uzamış veya bozulmuş görünmesi gibi, 3D modelin rengini 2D’ye açan görüntü de bozulabilir
- Açılmış 2D görüntü, daha sonra 3D model yüzeyine uygulanacak renkleri içeren texture’dır
- Image texture oluşturmanın bir yolu, boş bir görüntü dosyası oluşturup ardından 3D nesnenin her yüzeyi için bu görüntünün hangi kısmının kullanılacağını belirlemektir
- Farklı 3D yüzeyler aynı texture bölgesini paylaşabilir; simetrik gövdelerde yalnızca bir tarafı boyayıp aynı bölgeyi iki taraftaki yüzeylere atamak yaygındır
- Her yüzeyin kullandığı texture bölgesinin gerçek 3D yüzeyle aynı boyutta veya oranda olması gerekmez
Texture boyama ve UV koordinatları
-
Texture üzerine boyadığınız şey modelde görünür
- Texture üzerine boyanan her şey 3D model üzerinde görüntülenir
- Çoğu yazılım, 3D modelin üzerine doğrudan boyadığınızda bunun yerine image texture’ı boyayan özellikler sunar
-
UV koordinatları texture üzerindeki 2D konumdur
- 3D modelin her yüzeyi için ayrılan texture bölgesi UV map’tir; image texture’ın bir kısmını 3D modelle bağlayan veridir
- UV, image texture üzerindeki konumu gösteren 2D koordinat olarak düşünülebilir
- Her 3D yüzey birden fazla noktayla tanımlanır; bu noktalar image texture üzerine yerleştirildiğinde her nokta UV koordinatlarına sahip olur
(0.5, 1.0)içinde ilk değer olan0.5soldan sağa yönün yarı noktasını, ikinci değer olan1.0ise dikey yönde en üstü ifade eder- UV değerlerinin ikisi de genellikle 0.0 ile 1.0 arasındadır; çoğunlukla
(0, 0)ile(1, 1)arasındaki dikdörtgenin içindeki koordinat alanı kullanılır - Piksel konumları yerine 0 ve 1 kullanmak, soldan sağa ve aşağıdan yukarı ne kadar ilerlediğinizi oran olarak ifade etmeyi sağlar; 100 ile çarpınca yüzde gibi anlaşılabilir
- Bu iki boyutun gerçek adları U ve V’dir; X, Y ve Z zaten 3D konum için kullanıldığı için UV adı kullanılır
Grafiklerde renk ve veri tipleri
-
RGB rengi üç değerle ifade eder
- Bilgisayar grafiklerinde renk genellikle RGB, yani kırmızı, yeşil ve mavi ile ifade edilir
- Tek bir rengin kırmızı, yeşil ve mavi miktarı genellikle 0.0 ile 1.0 arasında bir değerdir
- Kırmızı
(1.0, 0.0, 0.0), siyah(0.0, 0.0, 0.0), beyaz ise(1.0, 1.0, 1.0)olarak ifade edilir - Web grafiklerinde kullanılan
0xff0000gibi onaltılık gösterimler de aynı bilgiyi farklı bir biçimde gösterir
-
UV’yi renk olarak görmek koordinatları görünür kılar
- UV koordinatlarını görselleştirirken geleneksel olarak ilk değer olan X kırmızı, ikinci değer olan Y yeşil olarak kullanılır; mavi ise
0.0bırakılır - UV
(0, 1), renk(0.0, 1.0, 0.0)olur ve yeşil görünür - UV
(1, 0), renk(1.0, 0.0, 0.0)olur ve kırmızı görünür - Bir dikdörtgeni UV konumuna göre renklendirirseniz, sol üste gidildikçe yeşil güçlenir, sağ alt kırmızı olur
- Sol alt, kırmızı ve yeşilin ikisi de 0 olduğu için siyah olur; sağ üstte hem kırmızı hem yeşil bulunduğundan sarı olur
- UV koordinatlarını görselleştirirken geleneksel olarak ilk değer olan X kırmızı, ikinci değer olan Y yeşil olarak kullanılır; mavi ise
-
float, vec2, vec3
floattek bir ondalıklı sayı, yani kayan noktalı sayıdırvecvektör anlamına gelir;vec2iki ondalıklı sayıdan oluşan bir çift,vec3ise üç ondalıklı sayıdan oluşan bir gruptur- RGB renkleri kırmızı, yeşil ve mavi olmak üzere üç değere sahip olduğundan
vec3ile ifade edilir - UV, X ve Y olmak üzere iki değere sahip olduğundan
vec2’ye karşılık gelir
Örnek grafik kodunun çalışma biçimi
- Bu serideki kod örnekleri ayrı bir 3D model kullanmaz; bunun yerine tüm ekranı kaplayan tek bir 3D yüzey kullanır
- Renkleri image texture ile eklemek yerine, kod image texture üzerindeki renkleri doğrudan belirler
- İşlem akışı şöyledir
- 3D sahnedeki kamera hangi 3D yüzeyin göründüğünü hesaplar
- Her yüzey için ayrılmış texture bölgesi, yani UV mapping, kullanılarak UV koordinatları hesaplanır
- Hesaplanan UV koordinatları ve 3D konum gibi bilgiler koda aktarılır
- Kod, ilgili konumdaki rengi belirler
- Bu işlem saniyede milyonlarca kez gerçekleşen bir süreç olarak anlaşılabilir
- Grafik kodu, ekrandaki bir noktadan başka bir noktaya kesintisiz çizgiler doğrudan çizmekten ziyade, her konum seçildiğinde o konumun rengini yanıtlayan bir yaklaşıma daha yakındır
- Yazdığınız kod, tüm rengi oluşturmak için yalnızca bir kez çalıştırılmaz; ekranın küçük parçaları olan her piksel için çalıştırılır
- Diğer ekran bölgelerinin renklerini kontrol edememe kısıtı nedeniyle grafik programlama, genel programlama deneyimi olanlar için bile farklı bir düşünme biçimi gerektirir
- part 1, bu kısıtlar içinde bile ilgi çekici görseller üretme yöntemleriyle devam eder
1 yorum
Hacker News yorumları
Ben David Tristram. 1990’larda bilgisayar grafikleri performans grubu Raster Masters’ın kurucu üyelerinden biriydim ve @hopkins’in dediği gibi, gelişmiş Silicon Graphics workstations kullanarak Grateful Dead, Herbie Hancock ve Graham Nash gibi isimlerin canlı müzik performanslarına eşlik eden sentezlenmiş görüntüler üretiyordum
Çeşitli dönüşümlerden sonra şimdi ağırlıklı olarak 2D video işleme ortamları olan Resolume Avenue ve TouchDesigner’da çalışıyorum. Buradaki bağlantılar bana ilham veriyor
Ben bugünlerde sunum yaparken sadece projektörü dizüstü bilgisayara takınca görüntü gelip gelmeyeceği bile her seferinde zar atmak gibi hissettiriyor ve strese sokuyor; o dönemde grubun üstündeki ekrana canlı yüksek çözünürlüklü SGI görüntüsü yansıtmak için hangi projektörlerin, kalibrasyonun ve hazırlığın gerektiğini de merak ediyorum
Fazla alt seviyeye inmeden psikedelik grafiklerle oynamak istiyorsanız hydra iyi bir seçenek. JavaScript tabanlı bir live coding ortamı ve öğrenme eğrisi de yumuşak
Orijinal yazı ve UV koordinatlarıyla ilgili olarak, geçmişte dikdörtgen bir mesh’in her köşesi için UV doku koordinatlarını ilginç biçimde kaydırma yöntemlerini çok araştırmıştım
O zamanlar tepe noktası başına renk kullanıyorduk; bugün olsa muhtemelen ShaderToy’dakilere benzer fragment (piksel) shader’ları kullanırdım. Özellikle ilginç bir yöntem, doku koordinatlarını bir akış alanı (flow field) boyunca adveksiyonla taşımak. Herhangi bir 2D vektör alanı kullanıp her koordinata yinelemeli olarak yer değiştirme uygulamanız yeterli. Hatta hatalı açık yöntemlerle bile sonuçlar iyi oluyor
Koordinatlar çok uzağa bozulunca görüntü tanınmaz hale geliyor, ama basit bir çözüm koordinatlara onları asıl konumlarına geri çeken bir “geri yükleme” kuvveti vermek. Böylece ayna folyosu parçalarını düzleştirir gibi kendi yerlerine geri sıçrıyorlar
Şimdi bu tür yer değiştirme efektleriyle birlikte feedback kullanıyorum. Çok küçük kaydırmaları tekrar tekrar uygulayınca hareket akışkan akışına oldukça benziyor
Rastgele bir dikdörtgen seçip onu rastgele bir ofsetle kopyalama işlemini tekrar ettikçe, çok dijital, köşeli ve keskin bir etki bile biraz rastlantısallıkla (dithering) yumuşak ve organik bir etkiye dönüşüyor. Siyah beyazda da iyi çalışıyordu ve sonuçta sadece PostScript’ti
https://www.donhopkins.com/home/archive/news-tape/fun/melt/m...
Jeremy’nin orijinal “Big Brother” eye.ps dosyası da var. Yuvarlak NeWS göz penceresini gösteren klasik bir demoydu
https://www.donhopkins.com/home/archive/news-tape/fun/eye/ey...
LGR: Kai's Power Goo – Classic 90s Funware for PC!
https://www.youtube.com/watch?v=xt06OSIQ0PE
HTML’de görüntüler üzerinde çalışan shader’ları kolayca kullanabilmeyi seviyorum. Bu alandaki becerim orta karar ama insanların bunu nereye kadar zorladığını görmek keyifli
Basit bir derinlik haritası yaklaşımı bile sağlansa sonuç çok daha ilginç hale geliyor. Birkaç yıl önce benzer bir teknikle görüntüler arasında “ilginç efektler” eşliğinde yumuşak crossfade yapan bir proje yapmıştım; yazısı ve demosu burada
https://sheep.horse/2017/9/crossfading_photos_with_webgl_-_b...
Dürüst olmak gerekirse, bu yazıyla birlikte verilen Rolling Hills yazısı çok daha ilgi çekici
Özellikle ortalara doğru, statik bir görüntüye aşağıdaki kodun uygulandığı bölüm etkileyici
uv.x = uv.x + sin(time + uv.x * 30.0) * 0.02;uv.y = uv.y + sin(time + uv.y * 30.0) * 0.02;Çeşitli psikedelik deneyimler yaşamış biri olarak, en azından düşük ve kahramansı olmayan dozlarda bunun gerçek görsel deneyime en yakın şey olduğunu söyleyebilirim. Dalgalar biraz yavaşlatılsa ve hareket aralığı hafifçe azaltılsa daha da benzer olurdu
Performans için havalı görsellerden çok, psikedelik maddelerin tetiklediği görsel halüsinasyonları yeniden üretmekle ilgileniyorum. Elbette iki taraftaki sanatçılara da saygım var
Modern araçlarla harika psikedelik videolar yapan bir sanatçı var ama kullanıcı adını bir türlü hatırlayamıyorum. Bulursam aşağıya bırakırım
Rolling Hills yazısının bu kısmını düşününce Midsommar’daki mantar çayı sahnesi, özellikle de ağaç kabuğu sahnesi aklıma geliyor. Nesnelerin “nefes alması” ve akması gerçekten çok özgün bir görsel deneyim; bunun farklı şekillerde uygulanışını görmek hoşuma gidiyor
Doğaya bakarken görülen görüntüler, geometrik desenlerin oluşmaya başlama biçimi ve “nefes alma” efekti çok güçlü. Birden fazla maddeyi ele alıyor ve yüzeylerin hafifçe nefes alması ya da nabız gibi atmasından, DMT gibi maddelerde ortaya çıkan tam anlamıyla geometrik “dünyalara” kadar geniş bir yelpaze gösteriyor
https://www.youtube.com/@josikinz
90’ların başında Todd Rundgren, Mac uygulaması Flowfazer’ı yayımladı. Deneyimi simüle etmiyordu ama dikkati başka yöne çekip akışın sürmesine yardımcı oluyordu
Bazı insanlar bunu kendi üretimleri için bir rehber olarak da kullandı
[1] https://grokware.com/
[2] https://m.youtube.com/watch?v=3Z4X4FmIhIw
O dönem ekran koruyucuların ve palet animasyonunun dönemiydi
Bu tür şeyleri seviyorsanız ve müzisyen Tipper’ın performansında Fractaled Visions’ın görselleri üstlendiğini görme şansınız olursa, inanılmaz bir deneyim olur
Şimdiye kadar gördüğüm psychedelic artifact’lerin görsel tasvirleri içinde en isabetlisi buydu. Geçen yıl birlikte yaptıkları bir gösteriyi izledim ve hayatımdaki en iyi sanat deneyimiydi. Fractaled Visions’ın görselleri, zenginlik ve karmaşıklık açısından neredeyse inanılması güç düzeydeydi
Shader programlama gibi konularda epey bilgim olmasına rağmen bazı efektlerde “bunu nasıl yaptılar?” diye düşündüm. Aşağıdaki set videosu deneyimi tam olarak yansıtmasa da atmosferi veriyor. Bunu 4K 60fps izlemek bambaşka bir seviyedeydi
https://youtu.be/qMcqw12-eSk?si=R5mCaIbR01w3Tbyv
Burada bir ShaderToy bağlantısı olmalı: https://www.shadertoy.com
Bu alandaki eski bir Flash klasiği olan Flashback.swf’yi hatırlattı. Bunun video render’ı burada: https://m.youtube.com/watch?v=KaSqrx93rS0
Bu animasyonda Divine Moments of Truth remiksi kullanılmıştı; muhtemelen “Russian Bootleg” sürümüydü. Daha önce de elektronik müzik dinliyordum ama bu tür elektronik müziği ilk duyduğumda gerçekten aklımı başımdan almıştı
Bu hafta çalışırken WebGL shader’ları yazıyor ve fiziksel kamera efektleri gibi görünmeleri için ayrıntıları ince ince ayarlıyordum
Ama bazen bir şeyi yanlış yapınca bu yazıda anlatılana benzer sonuçlar çıkıyor ve dürüst olmak gerekirse bunlar standart görüntü efektlerinden çok daha eğlenceli
Görsel olarak kullanılabilecekleri durumlar sınırlı olabilir ama bilgisayar grafiklerinin çalışma biçimi için kurduğumuz modellerle oynamak, her sistemi öğrenmek için çok iyi bir yöntem. Sadece grafik değil; programlamanın temel matematiğini, GPU’nun nasıl çalıştığını ve bellek ile CPU’yla bağlantısını, gözün nasıl çalıştığını, animasyon ve zamanın nasıl ele alınacağını da öğrenebiliyorsunuz