การเขียนโปรแกรมกราฟิกจำลองการเปลี่ยนแปลงจาก Chrono Trigger ภายในเกต


9

ฉันเริ่มเล่นเกมนี้เป็นครั้งแรกเมื่อเร็ว ๆ นี้และนี่เป็นจุดสนใจของฉันจริงๆ

คุณสามารถเห็นการเปลี่ยนแปลงในการเคลื่อนไหวเริ่มต้นที่ ~ 12: 08

ดูเหมือนว่าจะมีคณิตศาสตร์ที่น่าสนใจเกิดขึ้นในนั้น ดูเหมือนว่ามีสองมุมมองที่แตกต่างกันมารวมกัน ระลอกคลื่นสีฟ้าจะถูกเรนเดอร์เป็นครั้งแรกในพื้นหลังจากนั้นคลื่นสั่นสีม่วงจะปรากฏขึ้นในการฉายภาพหลอก 3D บางประเภท

พวกเขามาถึงผลลัพธ์นี้อย่างไร แต่อยู่นอกเหนือฉันและความอยากรู้อยากเห็นได้ดีกว่าของฉัน

ฉันไม่ได้คาดหวังว่าผู้คนจำนวนมากจะรู้ว่าสิ่งนี้ทำโดยเฉพาะอย่างยิ่ง แต่ถ้าใครมีการเขียนโปรแกรมกราฟิกที่กว้างขวางบางอย่างพวกเขาอาจจะสอนฉัน


2
ดูเหมือนเครื่องบิน 3 ลำหนึ่งลำอยู่ด้านบนหนึ่งอันด้านล่างและอีกอันหันหน้าเข้าหากล้อง
MichaelHouse

ระนาบที่อยู่ด้านบน / ล่างนั้นจะถูกปรับขนาดอย่างไม่สม่ำเสมอเพื่อให้ภาพลวงตาของความลึก ไม่มี "กล้อง" เพียงบางสิ่งที่ปรับขนาดหรือไม่ "กล้องหันหน้าไปทาง" หนึ่งอาจเป็นเพียงภาพเคลื่อนไหวหรือบางสิ่งบางอย่างหรือบางส่วนของภาพเคลื่อนไหวที่ฉลาด
RandyGaul

1
ลองอ่านบทความ Wikipedia นี้: en.wikipedia.org/wiki/Mode_7
Neverender

คำตอบ:


11

ฉันพยายามทำซ้ำเอฟเฟกต์โดยใช้ shader

ศูนย์ Shader00: https://www.shadertoy.com/view/XsXSz2

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

:) อย่างที่ Byte56 กล่าวคุณสามารถตั้งค่าเครื่องบินสามลำ เครื่องบินหันหน้าเข้าหากล้องตรงไปข้างหน้าด้วย Shader00 จากนั้นเครื่องบินสองลำที่มี Shader01 อาจเป็นไปตามที่ RandyGaul พูดถึงด้านบน / ล่างไม่ปรับขนาดอย่างสม่ำเสมอเพื่อให้ภาพลวงตาของความลึก

ฉันเชื่อว่าพวกเขาควรให้รูปลักษณ์ 3 มิติที่เพียงพอที่จะเชื่อ

ทั้งสองเฉดสีนั้นไม่เหมือนกันกับในลิงก์ YouTube ของคุณ อย่างไรก็ตามฉันเชื่อว่าผู้ที่น่าสนใจเหล่านี้สามารถหวังว่าจะให้สถานที่ที่จะเริ่มสร้างเวอร์ชันของคุณเอง

บทช่วยสอน: วิธีทำรูปแบบแถบแบบง่าย

แต่ละจุดบนระนาบมีการประสานงาน ความพยายามในการสร้างเอฟเฟกต์ shader นั้นเป็นการแสดงภาพคณิตศาสตร์ 2D บนเครื่องบิน ที่นี่ฉันขอแนะนำตัวอย่างง่ายๆ

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

ป้อนคำอธิบายรูปภาพที่นี่

สีแดงจะแสดงพิกัด x และสีเขียวจะแทนพิกัด y สำหรับตอนนี้เราต้องการสร้างเอฟเฟกต์ shader ที่ง่ายที่สุด แถบ เราไม่ต้องการค่า 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?

สิ่งที่ฉันพยายามแสดงคือถ้าคุณพยายามเข้าใกล้การเขียนโปรแกรม shader ด้วย "ตรรกะ" การเขียนโปรแกรมแบบดั้งเดิมมากขึ้นแล้วคุณมีแนวโน้มที่จะล้มเหลว เมื่อพูดถึงเรื่อง shader ทุกอย่างเกี่ยวกับคณิตศาสตร์

การพูดของคณิตศาสตร์รูปแบบที่คล้ายกับรูปแบบ "แถบ" มากที่สุดคืออะไร? กล่าวอีกนัยหนึ่งสมการที่มีลักษณะเป็นแถบคืออะไร ใช่. Y = sin (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);

ป้อนคำอธิบายรูปภาพที่นี่

คุณอาจพูดว่า shader นี้ไม่ได้สร้างแถบที่สมบูรณ์แบบเหมือนในช่วงต้นของ shader แต่จริงๆแล้วสิ่งที่คุณต้องทำคือเขียนสมการที่เหมาะสมมากขึ้น!

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
โครโนไกถูกปล่อยออกมาสำหรับ SNES ซึ่งไม่ได้มีเครื่องบิน แต่มันก็มีโหมด 7 แนวคิดเดียวกันเพียงรายละเอียดทางเทคนิค
Icy Defiance

2
บางทีคุณสามารถเพิ่มคำตอบด้วยการอธิบายวิธีสร้างเฉดสีได้อย่างไร มิฉะนั้นหากลิงก์ตายไปคำตอบนี้จะไร้ประโยชน์ส่วนใหญ่
MichaelHouse

เห็นด้วยกับ Byte56 ที่ใครบางคนสามารถเรียนรู้ความรู้ที่จะทำให้ glsl shaders เช่นนี้และสิ่งที่เป็นกระบวนการคิดของคุณเมื่อเขียนขึ้น?
oxysoft

1
@ oxysoft shaders ประเภทนี้มีความหลากหลายของรูปแบบจากเอฟเฟกต์แสงแบบดั้งเดิม เฉพาะที่เป็นอยู่มีทรัพยากรไม่มากที่ครอบคลุม "วิธีการทำให้พวกเขา" อย่างไรก็ตามนั่นไม่ได้หมายความว่าคุณไม่สามารถหาตัวอย่างได้ ลอง shadertoy.com และเว็บไซต์ "fun shader" อื่น ๆ เพื่อดูตัวอย่างที่ดีมากมายของสิ่งที่คุณสามารถทำได้ด้วย shader วิธีที่ดีที่สุดสำหรับคุณที่จะเรียนรู้วิธีสร้างมันขึ้นมา (ฉันคิดว่า) คือการเรียนรู้วิธีการใช้ shader ทั่วไปและศึกษาตัวอย่าง "fun shader" ที่พบในอินเทอร์เน็ต
Tofu_Craving_Redish_BlueDragon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.