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

9

Я начал играть в эту игру впервые за последнее время, и это действительно заинтересовало меня

Вы можете увидеть переход в движении, начинающийся с ~ 12: 08

Там, кажется, есть некоторые интересные математики, происходящие там. Казалось бы, есть две разные точки зрения, объединенные вместе. Сначала на заднем плане отрисовывается голубая рябь, а затем появляются фиолетовые колеблющиеся волны в какой-то псевдо 3D проекции.

Как именно они пришли к этому результату, однако, вне меня, и любопытство взяло верх над мной.

Я не ожидаю, что многие люди узнают, как это особенно делается, но если бы кто-то занимался обширным графическим программированием, возможно, они могли бы просветить меня.

oxysoft
источник
2
Выглядит как 3 самолета, один сверху, один снизу и один лицом к камере.
MichaelHouse
Плоскости сверху / снизу также масштабируются неравномерно, чтобы создать иллюзию глубины. Там нет "камеры", просто некоторые вещи масштабирования или нет. «Лицом к камере», вероятно, является просто анимация или что-то, или какая-то хитрая мозаика анимации.
RandyGaul
1
Прочтите эту статью в Википедии: en.wikipedia.org/wiki/Mode_7
Neverender,

Ответы:

11

Я попытался продублировать эффект с помощью шейдера.

Центр Shader00: https://www.shadertoy.com/view/XsXSz2

Стороны Shader01: https://www.shadertoy.com/view/4sXSz2

:) Вы можете, как сказал Byte56, установить три самолета. Плоскость, обращенная к камере непосредственно вперед с Shader00, а затем две плоскости с Shader01, perhapss, как упомянул RandyGaul, сверху / снизу неравномерно масштабируется, чтобы создать иллюзию глубины.

Они должны, я считаю, дать достаточно 3D-вид, чтобы быть убедительным.

Оба шейдера не совсем такие же, как в вашей ссылке на 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 ~~~

Далее: Как сделать волнистый узор в полоску.

Tofu_Craving_Redish_BlueDragon
источник
1
Chrono Trigger был первоначально выпущен для SNES, у которого не было самолетов, но у него был Режим 7 . Та же концепция, просто техническая деталь.
Ледяной неповиновение
2
Возможно, вы можете добавить к ответу, описав, как создаются шейдеры? В противном случае, если ссылки когда-либо умрут, этот ответ будет в основном бесполезным.
MichaelHouse
Согласен с Byte56, где кто-то может получить знания, чтобы сделать glsl-шейдеры такими, как эти, и каков ваш мыслительный процесс при написании?
oxysoft
1
@oxysoft Эти типы шейдеров больше отличаются от традиционных шейдеров с световым эффектом. Как бы они ни были специфичны, не так много ресурсов, которые рассказывают о том, «как их сделать». Однако это не означает, что вы не можете найти примеры. Попробуйте shadertoy.com и другие «веселые шейдерные» сайты, чтобы увидеть много замечательных примеров того, что вы можете сделать с шейдером. Лучший способ для вас научиться их создавать (я думаю) - изучить только общие практики шейдеров и изучить примеры «забавных шейдеров», найденные в Интернете.
Tofu_Craving_Redish_BlueDragon