Графічне програмування, що повторює перехід від Chrono Trigger всередині воріт


9

Я вперше почав грати в цю гру останнім часом, і це дійсно досягло мого інтересу

Ви можете бачити перехід у русі починаючи з ~ 12: 08

Здається, там відбуваються цікаві математики. Здається, є два різні погляди, об'єднані разом. Блакитні брижі виводяться спочатку на задньому плані, а потім фіолетові коливальні хвилі здаються виведеними на якусь псевдо 3D-проекцію.

Наскільки саме вони прийшли до цього результату, це не виходить за мене, і цікавість мене покращила.

Я не сподіваюся, що багато людей знають, як це робиться особливо, але якщо хтось зробив якесь велике графічне програмування, можливо, він міг би мене просвітити.


2
Виглядає як три площини, одна вгорі, одна внизу і одна звернена до камери.
MichaelHouse

Площини зверху / знизу також нерівномірно масштабуються, щоб створити ілюзію глибини. Немає жодної "камери", просто якісь масштабуючі речі чи ні. "Обличчям до камери", ймовірно, є лише анімація чи щось таке, або якась хитра плитка анімації.
RandyGaul

1
Перегляньте цю статтю у Вікіпедії: en.wikipedia.org/wiki/Mode_7
Neverender

Відповіді:


11

Я намагався дублювати ефект, використовуючи шейдер.

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

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

:) Ви могли, як сказав Байт56, встановити три літаки. Камера, спрямована на площину прямо вперед з Shader00, а потім два літаки з Shader01, пергапс, як згадував RandyGaul, вгорі / внизу нерівномірно масштабується, щоб створити ілюзію глибини.

Вважаю, вони повинні надати достатньо тривимірного вигляду, щоб бути переконливим.

Обидва два шейдери не зовсім такі, як у вашому посиланні на YouTube (також вони більш грубі). Однак я вважаю, що ці шейдери, сподіваємось, можуть дати вам місце для початку створення власної версії.

Підручник: Як зробити простий візерунок смужки.

Кожна точка площини має координату. Спроба створити ефект шейдера - це в основному візуалізація 2D математики на площині. Тут дозвольте представити простий приклад.

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

введіть тут опис зображення

Червоний колір буде представляти координату x, а зелений відтінок - координату y. На даний момент ми хочемо створити найпростіший ефект шейдера; смуга. Для цього підручника нам не знадобиться значення uv.y.

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

введіть тут опис зображення

Ви можете бачити, що червоний відтінок стає інтенсивним, коли він спрямований в праву сторону. Це тому, що значення x координати стає вище, коли ви рухаєтесь до правої сторони; лівий кінець x координата починається від 0, а правий кінець x - 1.

Оскільки ми маємо це основне розуміння, спробуємо щось "інтуїтивно зрозуміле"

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);

введіть тут опис зображення

Там у вас смугастий візерунок. Зачекайте ... це виглядає не зовсім правильно. Так, це просто червоний і чорний. Візерунок смуги складається з більш ніж двох кольорових секцій. Там ...!

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);

введіть тут опис зображення

але що робити, якщо ми хочемо зробити N кількість смуг?

Я намагаюся показати, що якщо ви спробуєте наблизитись до шейдерного програмування з більш традиційною "логікою" програмування, ви, швидше за все, не зможете. Коли мова заходить про шейдер, то все стосується математики.

Якщо говорити про математику, то який візерунок найбільше нагадує візерунок "смугастий"? Іншими словами, яке рівняння має вигляд смужки? Так. Y = гріх (X). Однак наше значення X коливається в межах від 0,0 ~ 1,0 Якщо ми хочемо використовувати Y = sin (X), ми хочемо, щоб наше значення x становило від 0,0 ~ 6,28 (що приблизно становить 2 PI)

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);

введіть тут опис зображення

Тепер у нас є "смуга" з точки зору шаблону, породженого рівнянням. Чому ми повинні використовувати цей підхід? Це не тільки може бути швидше, але й усуває необхідність писати потворні умови "якщо", щоб мати N кількість смужок. Якби ми хотіли мати більше однієї смуги, ми могли б просто розширити шаблон, збільшивши максимальне значення X ще більше.

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);

введіть тут опис зображення

Можна сказати, що цей шейдер не дає ідеальної смуги, як на початку раннього шейдера, але насправді, все, що вам потрібно зробити, - це написати більш придатне рівняння!

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);

введіть тут опис зображення Weeee ~~~

Далі: Як зробити хвилястий візерунок смужки.


1
Chrono Trigger спочатку був випущений для SNES, у якого не було літаків, але у нього був Mode 7 . Та сама концепція, лише технічна деталь.
Крижане протистояння

2
Можливо, ви можете додати відповідь, описуючи, як створюються шейдери? В іншому випадку, якщо посилання коли-небудь загинуть, ця відповідь буде здебільшого марною.
MichaelHouse

Погоджено з Byte56, де хтось може засвоїти знання, щоб зробити штрих glsl подібними до цих, і який ваш розумовий процес при його написанні?
oxysoft

1
@oxysoft Ці типи шейдерів більше відрізняються від традиційних шейдерів з світловим ефектом. Наскільки вони специфічні, не так багато ресурсів висвітлюють "як їх зробити". Однак це не означає, що ви не можете знайти приклади. Спробуйте shadertoy.com та інші веб-сайти "веселого шейдера", щоб побачити багато чудових прикладів того, що можна зробити з шейдером. Найкращий для вас спосіб навчитися їх робити (я думаю) - це навчитися просто загальним шайдерським практикам та вивчати ті приклади "веселих шейдерів", які можна знайти в Інтернеті.
Tofu_Craving_Redish_BlueDragon
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.