วิธีสร้างภาพยนตร์แอนิเมชันด้วย 8kB
- ในเดือนพฤศจิกายน 2022 ได้เริ่มความท้าทายในการสร้างแอนิเมชันแบบเรียลไทม์ภายในขนาดไม่เกิน 8 กิโลไบต์
- เป้าหมายคือรวมกราฟิกคุณภาพดี แอนิเมชัน การกำกับงานภาพ การทำงานของกล้อง และดนตรีเข้าไว้ด้วยกัน
- ในเดือนเมษายน 2023 หลังจากทำงานมาหลายเดือน ก็สร้าง "The Sheep and the Flower" เสร็จและเผยแพร่ออกมา
ภาพรวม
- ผลลัพธ์เป็นไฟล์รันบน Windows โดยองค์ประกอบภาพทั้งหมดใช้ GLSL shader ที่คำนวณแบบเรียลไทม์บน GPU
- การเรนเดอร์ใช้เทคนิค ray marching และ shader ถูกย่อขนาดด้วยเครื่องมือ Shader Minifier
- ดนตรีแต่งด้วย OpenMPT และซินธิไซเซอร์ 4klang โดยอธิบายเครื่องดนตรีแบบ procedural และบีบอัดรายการโน้ต
- โค้ดเขียนด้วย C++ และใช้เฟรมเวิร์ก Leviathan เพื่อเริ่มต้นแฟลกของคอมไพเลอร์และการตั้งค่าเริ่มต้น
- เอาต์พุตสุดท้ายถูกบีบอัดด้วย Crinkler
จุดเริ่มต้นของการสร้างสรรค์
- เริ่มโปรเจกต์นี้จากแรงบันดาลใจหลังอดีตเพื่อนร่วมงานแชร์วิดีโอชื่อ "Capoda" ที่สร้างไว้เมื่อนานมาแล้ว
- โปรเจกต์นี้อาจเป็นตัวอย่างที่ดีของ size coding ที่มีเรื่องราวเหมาะกับข้อจำกัดระดับ 8kB
- รู้สึกสนใจกับความท้าทายใหม่ที่ต่างจากการตั้งเป้าไว้ที่ 64kB
เรนเดอร์โลกด้วยสามเหลี่ยมสองอัน
- วาดสี่เหลี่ยมผืนผ้าที่ปกคลุมเต็มหน้าจอ (ประกอบด้วยสามเหลี่ยมสองอัน) แล้วรันโปรแกรมบน GPU (shader) ที่เขียนด้วยภาษา GLSL เพื่อคำนวณสีของแต่ละพิกเซลและแต่ละเฟรม
- แทนฉากด้วย signed distance field และใช้ ray marching เพื่อแปลง distance field เป็นพิกเซล
การกำกับ
- คิดหาวิธีเล่าเรื่องและถ่ายทอดอารมณ์ด้วยตัวละครและแอนิเมชันที่มีอยู่อย่างจำกัด
- ตัดองค์ประกอบที่ไม่จำเป็นต่อเรื่องออก แล้วโฟกัสที่รายละเอียด การกำกับ การตัดต่อ และการซิงก์กับดนตรี
- ใช้การทำงานของกล้องและเทคนิคการเล่าเรื่องเพื่อสื่ออารมณ์
กระบวนการพัฒนา
- ในซอร์สโค้ดมีค่าคงที่ที่ฮาร์ดโค้ดไว้จำนวนมาก และแต่ละค่าถูกกำหนดผ่านการลองผิดลองถูกหลายรอบ
- เพื่อให้ได้วงจรฟีดแบ็กที่รวดเร็ว จึงใช้ shader คอมไพล์ใหม่ระหว่างรันไทม์
- จำเป็นต้องมีเพลเยอร์ที่เป็นประโยชน์ต่อการทำแอนิเมชันและการควบคุมกล้อง
ดนตรี
- ดนตรีที่เข้ากับเรื่องราวต้องการหลายพาร์ตและการเปลี่ยนผ่านในช่วงเวลาที่เฉพาะเจาะจง
- แต่งเพลงด้วยซินธิไซเซอร์ 4klang และบีบอัดข้อมูลเพื่อประหยัดพื้นที่
แอนิเมชัน & การซิงก์
- ทุกอย่างในเดโมถูกประเมินใหม่ทุกเฟรม และประกอบด้วยช็อตกล้องที่กำหนดด้วยมือประมาณ 25 ช็อต
- ระหว่างสร้างแต่ละช็อต จะอธิบายว่าพารามิเตอร์แต่ละตัวของกล้องเปลี่ยนไปตามเวลาอย่างไร
เท็กซ์เจอร์ & วัสดุ
- ต่างจากเรนเดอร์แบบดั้งเดิม ระบบนี้คำนวณและใช้งานเท็กซ์เจอร์ 3D แบบเรียลไทม์
- เท็กซ์เจอร์อย่างป้ายจราจรถูกสร้างขึ้นจากการรวมหลายฟังก์ชันเข้าด้วยกัน
ดวงตา
- ในช่วงแรกของการพัฒนา ดวงตาดูไร้ชีวิตและเหมือนวัตถุไม่มีชีวิต แต่เป็นองค์ประกอบสำคัญในฐานะเครื่องมือการเล่าเรื่อง
- จึงเพิ่มแสงสะท้อนในดวงตาเพื่อทำให้ดูมีชีวิตชีวา
โพสต์โปรเซส
- ใช้การปรับสี การแก้แกมมา วิกเน็ต ฟิลเตอร์ FXAA และอื่น ๆ เพื่อเพิ่มงานภาพขั้นสุดท้ายและกำหนดบรรยากาศของเรื่องราว
การบีบอัด
- เลือกแนวทางใช้โค้ดสร้างข้อมูลแทนการเก็บข้อมูลไว้โดยตรง
- ใช้เครื่องมือบีบอัด Crinkler เพื่อทำให้ไฟล์รันสามารถแตกไฟล์ตัวเองได้
การย่อขนาด
- ใช้เครื่องมือ Shader Minifier เพื่อทำให้ซอร์สโค้ด shader เล็กที่สุดเท่าที่จะทำได้
- เพิ่มฟีเจอร์ใหม่เข้าไปใน Shader Minifier เพื่อย่อและบีบอัดโค้ด shader
สงครามระหว่างแกะกับดอกไม้
- คิดว่าสงครามระหว่างแกะกับดอกไม้ไม่สำคัญหรือ? ประเด็นนี้ที่ถูกกล่าวถึงใน "เจ้าชายน้อย" เป็นส่วนสำคัญของเรื่องราว
บทสรุป
- เดโมลักษณะนี้ตั้งอยู่บนทักษะขั้นสูงที่จำเป็นต่อการสร้างและงานวิจัยที่มีอยู่ก่อนแล้ว
- หวังว่าฟีเจอร์ใหม่เหล่านี้จะช่วยให้คนอื่นสร้างเดโมที่ดียิ่งขึ้นได้
- หมวดหมู่ 8kB เปิดโอกาสได้มากกว่า 4kB และหวังว่าจะได้รับความนิยม
ความเห็นของ GN⁺
- โปรเจกต์นี้เป็นตัวอย่างของการก้าวข้ามข้อจำกัดทางเทคนิคและใช้ความคิดสร้างสรรค์เพื่อสร้างผลงานที่น่าทึ่ง
- แอนิเมชันที่เสร็จสมบูรณ์ภายในพื้นที่จำกัดอย่างยิ่งเพียง 8kB แสดงให้เห็นการผสมผสานระหว่างการเขียนโปรแกรม การเพิ่มประสิทธิภาพอัลกอริทึม และการแสดงออกทางศิลปะ
- การพัฒนาเครื่องมืออย่าง Shader Minifier และการใช้เครื่องมือบีบอัด Crinkler เน้นให้เห็นแนวทางที่สร้างสรรค์ในด้านวิศวกรรมซอฟต์แวร์และการบีบอัดข้อมูล
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
ความเห็นจากผู้สร้างต้นฉบับ:
การกล่าวถึง Sloot Digital Coding System:
ความเห็นเกี่ยวกับวิดีโอเดโมซีน:
การวิเคราะห์เทคนิคของเดโมซีน:
การหวนคิดถึงเกม .kkrieger:
คำแนะนำเกี่ยวกับ Cosmos Laundromat:
ปฏิกิริยาเชิงบวกต่อภาพยนตร์:
คำชมด้านความคิดสร้างสรรค์:
ความทรงจำเกี่ยวกับ Razor 1911:
ข้อมูลเกี่ยวกับหมวดหมู่เดโมซีน: