Kapı içindeki Chrono Trigger'dan geçişi kopyalayan grafik programlama


9

Son zamanlarda bu oyunu oynamaya başladım ve bu gerçekten ilgimi doruğa çıkardı

Hareketteki geçişi ~ 12: 08'den başlayarak görebilirsiniz

Orada bazı ilginç matematikler var gibi görünüyor. İki farklı görüşün bir araya geldiği anlaşılıyor. Mavi dalgalanmalar önce arka planda oluşturulur ve daha sonra mor salınım dalgaları bir çeşit sahte 3D projeksiyonda oluşturulmuş gibi görünür.

Ancak bu sonuca tam olarak nasıl geldiklerinin ötesinde ve merak beni daha iyi hale getirdi.

Pek çok insanın bunun nasıl yapıldığını bilmesini beklemiyorum ama eğer birisi kapsamlı grafik programlama yaptıysa, belki de beni aydınlatabilirler.


2
Biri yukarıda, biri aşağıda ve biri kameraya bakan 3 uçak gibi görünüyor.
MichaelHouse

Üstteki / alttaki düzlemler de derinlik yanılsaması vermek için eşit olmayan şekilde ölçeklendirilir. "Kamera" yok, sadece ölçekleme var ya da değil. "Kameraya dönük" olan şey muhtemelen sadece bir animasyon ya da bir şey ya da bir animasyonun akıllıca döşenmesidir.
RandyGaul

1
Bu Wikipedia makalesine göz atın: en.wikipedia.org/wiki/Mode_7
Neverender

Yanıtlar:


11

Gölgelendiriciyi kullanarak efekti çoğaltmaya çalıştım.

Shader00 Center: https://www.shadertoy.com/view/XsXSz2

Shader01 Taraflar: https://www.shadertoy.com/view/4sXSz2

:) Byte56'nın dediği gibi üç uçak kurabilirsiniz. Shader00 ile doğrudan ileriye doğru bakan bir uçak ve daha sonra Shader01 ile iki uçak, belki de RandyGaul'un belirttiği gibi, üst / alt derinlik yanılsaması vermek için eşit olarak ölçeklendirilmemiş.

İnanıyorum ki, ikna edici olmak için yeterli 3D görünüm vermeliler.

Her iki gölgelendirici de youtube bağlantınızla aynı değildir (ayrıca daha kaba taslaktır). Ancak, bu gölgelendiricilerin umarım kendi sürümünüzü oluşturmaya başlamanız için bir yer verebileceğine inanıyorum.

Öğretici: Basit bir şerit deseni nasıl oluşturulur.

Düzlemdeki her noktanın koordinatı vardır. Gölgelendirici efekti yaratmaya çalışmak temelde 2B matematiği düzlemde görselleştirmek. Burada basit bir örnek vereyim.

//This shader will visualize coordinates 
vec2 uv = gl_FragCoord.xy / iResolution.xy;
gl_FragColor = vec4(uv.x,uv.y,0,1);

resim açıklamasını buraya girin

Kırmızı renk x koordinatını ve yeşil renk tonu y koordinatını temsil eder. Şimdilik en basit gölgelendirici efekti oluşturmak istiyoruz; bir şerit. Bu eğitim için uv.y değerine ihtiyacımız olmayacak.

vec2 uv = gl_FragCoord.xy / iResolution.xy;
gl_FragColor = vec4(uv.x,0,0,1);

resim açıklamasını buraya girin

Kırmızı tonun sağ tarafa doğru yöneldiğinde yoğunlaştığını görebilirsiniz. Çünkü sağ tarafa hareket ettikçe koordinatın x değeri yükselir; sol uç x koordinatı 0'dan başlar ve sağ uç x koordinatı 1'dir.

Bu temel anlayışa sahip olduğumuz için "sezgisel" bir şey deneyelim

vec2 uv = gl_FragCoord.xy / iResolution.xy;
float color = 0.0;
if(uv.x < .5 ) color= 1.0 ;
gl_FragColor = vec4(color,0,0,1);

resim açıklamasını buraya girin

Orada bir şerit deseniniz var. Bekle ... bu pek doğru gözükmüyor. Evet bu sadece kırmızı ve siyah. Çizgili desen sadece iki renk bölümünden oluşur. Orada...!

vec2 uv = gl_FragCoord.xy / iResolution.xy;
float color = 0.0;
if(uv.x < .2 ||(uv.x >.4 && uv.x < .6) || (uv.x > .8 && uv.x <1.0 )) color= 1.0 ;
gl_FragColor = vec4(color,0,0,1);

resim açıklamasını buraya girin

Peki ya N sayıda şerit yapmak istiyorsak?

Göstermeye çalıştığım şey, geleneksel programlama "mantığı" ile gölgelendirici programlamaya yaklaşmaya çalışırsanız, muhtemelen başarısız olmanızdır. Gölgelendirici söz konusu olduğunda, hepsi matematikle ilgilidir.

Matematikten bahsetmişken, "şerit" desenine en çok benzeyen desen nedir? Başka bir deyişle, çizgiye benzeyen denklem nedir? Evet. Y = günah (X). Ancak X değerimiz 0.0 ~ 1.0 arasında değişiyorsa Y = sin (X) kullanmak istiyorsak, x değerinin 0.0 ~ 6.28 (kabaca 2 PI) arasında olmasını istiyoruz.

vec2 uv = gl_FragCoord.xy / iResolution.xy;
float x = uv.x * 2.0 *PI; 
float y = sin(x);
gl_FragColor = vec4(y,0,0,1);

resim açıklamasını buraya girin

Şimdi bir denklem tarafından üretilen örüntü açısından "çizgimiz" var. Neden bu yaklaşımı benimsemeliyiz? Bu sadece daha hızlı olmakla kalmaz, aynı zamanda N sayıda şerit olması için çirkin "if" koşullarını yazma ihtiyacını da ortadan kaldırır. Birden fazla çizgiye sahip olmak istersek, maksimum X değerini daha da artırarak deseni genişletebiliriz.

vec2 uv = gl_FragCoord.xy / iResolution.xy;
float x = uv.x * (2.0 *PI * 10.0); //ta dan!
float y = sin(x);
gl_FragColor = vec4(y,0,0,1);

resim açıklamasını buraya girin

Bu gölgelendiricinin erken gölgelendiriciden olduğu gibi mükemmel bir şerit üretmediğini söyleyebilirsiniz, ancak gerçekten yapmanız gereken tek şey daha uygun denklem yazmaktır!

vec2 uv = gl_FragCoord.xy / iResolution.xy;
float x = uv.x * (2.0 *PI * 10.0);
float y = sin(x) / abs(sin(x) );
gl_FragColor = vec4(y,0,0,1);

resim açıklamasını buraya girin Weeee ~~~

Sonraki: Dalgalı bir şerit deseni nasıl yapılır.


1
Chrono Trigger başlangıçta uçakları olmayan SNES için piyasaya sürüldü, ancak Mod 7'ye sahipti . Aynı konsept, sadece teknik bir detay.
Icy Defiance

2
Belki de gölgelendiricilerin nasıl oluşturulduğunu açıklayarak cevaba ekleyebilirsiniz. Aksi takdirde, bağlantılar ölürse, bu cevap çoğunlukla işe yaramaz.
MichaelHouse

Byte56 ile anlaştı, biri böyle glsl gölgelendiricileri yapmak için bilgiyi nereden öğrenebilir ve yazarken düşünce süreciniz nedir?
oxysoft

1
@oxysoft Bu tür gölgelendiriciler, geleneksel ışık efekti gölgelendiricilerinden daha fazla varyasyondur. Oldukları kadar özel, "nasıl yapılır" ı kapsayan çok fazla kaynak yoktur. Ancak bu, örnek bulamayacağınız anlamına gelmez. Gölgelendirici ile neler yapabileceğinize dair birçok harika örnek görmek için shadertoy.com ve diğer "eğlenceli gölgelendirici" web sitelerini deneyin. Onları nasıl yapacağınızı öğrenmeniz için en iyi yöntem (sanırım) sadece genel gölgelendirici uygulamalarını öğrenmek ve internette bulunan "eğlenceli gölgelendirici" örnekleri incelemek.
Tofu_Craving_Redish_BlueDragon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.