ZX Spectrum Raytracer ในรูปแบบพื้นฐาน

ZX Spectrum Raytracer ในรูปแบบพื้นฐาน

โหนดต้นทาง: 3085593

[Gabriel Gambetta] รู้บางสิ่งเกี่ยวกับตัวติดตามรังสี โดยเป็นผู้เขียน Tiny Raytracer ซึ่งเป็นตัวติดตามรังสีที่เขียนด้วย JavaScript เพียง 912 ไบต์ เป็นเวลานานแล้ว มนุษย์ ผู้ประสบภัยจาก ZX Spectrum ที่ออกแบบโดยสหราชอาณาจักร จะสามารถรวมเรื่องรัก ๆ ใคร่ ๆ ทั้งสองเข้าด้วยกันได้หรือไม่? Tiny Raytracer สามารถใส่กับ ZX Spectrum ได้หรือไม่ ในขั้นพื้นฐาน? คำตอบคือ เห็นด้วย แม้ว่าสเป็คที่รักของเราจะมีข้อจำกัดมากมายก็ตาม.

<img decoding="async" data-attachment-id="661085" data-permalink="https://hackaday.com/2024/01/26/a-zx-spectrum-raytracer-in-basic/screenshot-from-2024-01-25-21-02-18/" data-orig-file="https://platoaistream.com/wp-content/uploads/2024/01/a-zx-spectrum-raytracer-in-basic-1.png" data-orig-size="940,648" data-comments-opened="1" data-image-meta="{"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}" data-image-title="Screenshot from 2024-01-25 21-02-18" data-image-description="

https://gabrielgambetta.com/zx-raytracer.html

” data-image-caption data-medium-file=”https://platoaistream.com/wp-content/uploads/2024/01/a-zx-spectrum-raytracer-in-basic.png” ข้อมูลขนาดใหญ่ไฟล์ ="https://platoaistream.com/wp-content/uploads/2024/01/a-zx-spectrum-raytracer-in-basic-1.png?w=800″ class=”wp-image-661085 ขนาด- ปานกลาง” src =”https://platoaistream.com/wp-content/uploads/2024/01/a-zx-spectrum-raytracer-in-basic.png” alt width=”400″ height=”276″ srcset= ”https://platoaistream.com/wp-content/uploads/2024/01/a-zx-spectrum-raytracer-in-basic-1.png 940w, https://platoaistream.com/wp-content/uploads/ 2024/01/a-zx-spectrum-raytracer-in-basic-1.png?resize=250,172 250w, https://platoaistream.com/wp-content/uploads/2024/01/a-zx-spectrum-raytracer -in-basic-1.png?resize=400,276 400w, https://platoaistream.com/wp-content/uploads/2024/01/a-zx-spectrum-raytracer-in-basic-1.png?resize= 800,551 800w” ขนาด=”(ความกว้างสูงสุด: 400px) 100vw, 400px”>

การติดตามเรย์ด้วยสีหลักเพียง 15 สี

เรื่องราวเริ่มต้นด้วยของ [Gabriel] อัลกอริธึม raytracer ของคอมพิวเตอร์กราฟิกตั้งแต่เริ่มต้น (CGFS) และฐานโค้ดที่มีอยู่ซึ่งถูกย้ายไปยังภาษา BASIC ที่จำกัดมากของ ZX Spectrum โดยใช้ VSCode สำหรับการแก้ไข BAS2TAP เพื่อสร้างไฟล์ภาพเทป (โดยพื้นฐานแล้วคือแทร็กเสียง) และดำเนินการด้วย ฟิวส์- เมื่อจัดเรียง toolchain แล้ว [Gabriel] จะเพิ่มโค้ดเพียงพอที่จะจัดการกับสมการการแยกรังสีของทรงกลม และเรนเดอร์ฉากสามทรงกลมเป็นภาพสีขนาด 32×22 พิกเซล โดยใช้เวลารันไทม์เพียง 15 นาที ผู้ประสบภัยจะจำได้ว่าสเปกตรัมมีอาร์เรย์แอตทริบิวต์บล็อก 32 × 22 (หรืออาร์เรย์สี) พร้อมค่าสีสองค่าสำหรับพิกเซลพื้นหน้าและพื้นหลัง แต่ละบล็อกแอตทริบิวต์ประกอบด้วย 8×8 พิกเซล ซึ่งแต่ละบล็อกอาจเป็นพื้นหน้า (เปิด) หรือพื้นหลัง (ปิด) ขั้นต่อไปคือการขยายโค้ดเพื่อรองรับพิกเซลและบล็อก โดยเพียงแค่ขยาย raytracing ให้เต็ม 256 ความละเอียด ×176 และสำหรับแต่ละบล็อก เพียงกำหนดสองสีที่พบบ่อยที่สุด และใช้กับสีเหล่านั้นสำหรับทั้งบล็อก มันใช้งานได้ในรูปแบบ 'การปะทะกันของแอตทริบิวต์' แบบสเปกตรัม

แต่ตอนนี้รันไทม์คือ 17 ชั่วโมง! ถัดไป จุดของการปรับแต่งประสิทธิภาพ โดยใช้แฮ็กพื้นฐานสเปกตรัมจำนวนหนึ่ง และการประมาณกราฟิกบางอย่าง เช่น การหล่อรังสีสำหรับแต่ละมุมพิกเซลของบล็อก และหากเหมือนกัน ให้ระบายสีส่วนที่เหลือทั้งหมด 60 พิกเซลให้เหมือนกันและเดินหน้าต่อไป . ความพยายามนี้ลดรันไทม์ลงเหลือสองชั่วโมง

ถัดไป [Gabriel] ละทิ้งโมเดลแสงแบบเรียบอย่างกล้าหาญ สร้างแบบจำลองแหล่งกำเนิดแสงเดียว และดึงเคล็ดลับเดียวที่เหลืออยู่ในโลกสเปกตรัมขาวดำออกมา นั่นก็คือการปรับค่าความเข้มของสีสำหรับแต่ละบล็อก โดยใช้วิธีง่ายๆ 8×8 สั่งลายไดเทอร์นั่นก็ไม่ได้ดูแย่เกินไป เมื่อพิจารณาทุกอย่างแล้ว หยุดอย่างรวดเร็วระหว่างทางที่จะเสร็จสิ้น เพิ่มเงา และเวลารันกลับเป็น 17 ชั่วโมง แต่ก็ถือว่าคุ้มค่า ชัดเจนว่าสิ่งนี้ได้รับการปรับให้เหมาะสมสำหรับฉากประเภทเดียว โดยที่ทรงกลมมีลักษณะเด่น แต่มีหลักการอยู่ และคิวบ์ก็อยู่ห่างออกไปเพียงไม่กี่บรรทัดของโค้ด มีผู้รับบ้างไหม?

Raytracing เป็นหนึ่งในงานที่สนุกแต่ซับซ้อนซึ่งผู้คนชอบที่จะยัดเยียดฮาร์ดแวร์ที่ไม่เหมาะสม เช่นเครื่องคิดเลขกราฟ TI-84Plus CE นี้และถ้ามันเข้าถึงได้ยากสักหน่อย นี่ก็เป็นเรื่องที่บ้าไม่แพ้กัน ทำงานใน Excel รุ่นเก่าธรรมดา.

ประทับเวลา:

เพิ่มเติมจาก แฮ็ควัน