Ray Tracing ทำไมถึงเป็นเรื่องยาก
หนึ่งในส่วนที่น่าตื่นเต้นสำหรับการเปิดตัว iPhone 15 Pro และ 15 Pro Max สำหรับเราน่าจะเป็น Chip A17 Pro ที่มีการใส่หน่วยประมวลผลสำหรับการทำ Ray Tracing เข้ามาด้วย ทำให้น่าจะเป็นการพาคุณภาพ Graphic ในเกมบน Mobile สูงขึ้นมาก แต่ จริง ๆ แล้วมันไม่ได้ง่ายแบบนั้น วันนี้เรามาคุยกันว่า ทำไม Ray Tracing เป็นเรื่องยาก ทำไมมันเป็นเรื่องยาก
เราเห็นแสงได้ยังไง ?
ก่อนที่เราจะเล่าเรื่อง Ray Tracing เราต้องทำความเข้าใจพื้นฐานของ แสง ในโลกแห่งความเป็นจริงกันก่อน ว่า เราเห็นวัตถุ เราเห็นแสงได้อย่างไร
ฟิสิกส์ พูดถึงแสงไว้ 2 รูปแบบด้วยกันคือ เป็นกลุ่มคลื่นพลังงาน หรืออีกวิธีมันคือการเคลื่อนที่ของ Photons หลักการง่าย ๆ คือ เรามีแหล่งกำเนิดแสง เช่น หลอดไฟ หรือ ดวงอาทิตย์ ให้กำเนิดแสงออกมา เป็น Photons วิ่ง ๆ ออกมาเยอะ ๆ หรือเป็นคลื่นวิ่งออกมาเรื่อย ๆ จากนั้น มันจะไปตกกระทบกับวัตถุ กระทบกันไปมาจนมาเข้าตาเรา เราจึงเห็นแสง เห็นวัตถุได้เหมือนที่เราเห็นตอนนี้นั่นเอง และ นี่เราไม่ได้กำลังพูดถึงการวิ่งของ Photons แค่ 1-2 ตัว แต่เรากำลังพูดถึงหลายล้าน ๆ ตัว
Photons Simulation in Computer
พอมันเข้ามาอยู่ในระบบคอมพิวเตอร์ เช่น เราเล่นเกม เราจะเห็นว่า มีวัตถุและแหล่งกำเนิดแสงส่องอยู่ ทำให้เกิด เงา แบบที่เราเห็นในเกม แต่อย่างที่บอกว่า ถ้าเราจะคำนวณให้เหมือนจริง มันต้องอาศัยการคำนวณการวิ่งของ Photon มหาศาลมาก ๆ Hardware เอาไม่อยู่แน่นอน แน่นอนว่า เกมสามมิติมันไม่ได้พึ่งเกิดมา มันเกิดมานานมาก ๆ แล้วเขาแก้ปัญหานี้อย่างไรละ
ง่ายมากคือ ในเมื่อการประมวลผลแบบ Real-time มันทำไม่ได้ เราก็ทำมันไว้ล่วงหน้าสิ ศัพท์เวลาเราใช้คุยกันคือ "baked-in" หมายความว่า นักพัฒนาเขาวางแห่งกำเนิดแสงไว้ในที่ ๆ นึง ซึ่งมันจะปล่อยแสงออกมาในแต่ละพื้นที่เท่า ๆ กัน เมื่อเราเอาพวก ฉาก และ NPC เข้ามาใส่ ตัว Game Engine มันจะคำนวณแค่ว่า มีอะไรมาบังมั้ย ถ้าไม่มี มันจะไปดูว่า แล้วพื้นผิวของวัตถุนั้นมีความ มันวาวเงา สะท้อนแสงได้มากน้อยขนาดไหน และประมวลผลออกมาเป็นภาพ (สมัยก่อน เรื่องความ Texture ความมันวาวของวัตถุยังไม่มีด้วยซ้ำ)
ด้วยเทคนิคลักษณะนี้ ทำให้ตัวเครื่องไม่จำเป็นต้องมีการจำลองการวิ่งของ Photon จริง ๆ แต่เป็นเพียงแค่การเช็คตำแหน่งระหว่าง วัตถุ และ แหล่งกำเนิดแสงว่า มีอะไรบังอยู่มั้ย ถ้าไม่มีค่อยประมวลผลว่ามันควรจะออกมาเข้มอ่อนเยอะขนาดไหน มองอีกมุมคือ วัตถุแต่ละชิ้นในฉากไม่ได้มีปฏิสัมพันธ์ในแง่ของแสงกันเลย
ถ้ายังนึกภาพไม่ออก ลองไปดูพวกเกมที่ยังไม่มีพวก Ray Tracing ดูได้ ยกตัวอย่างเกมยอดฮิตอย่าง GTA V ออกมาเกือบ ๆ สิบปีได้แล้ว ลองสังเกตที่พวกวัตถุภายในเกม เราจะเห็นว่า แสงมันเกือบจะเท่ากันทั้งวัตถุหรือตัวละคร เช่นบางฉากที่เราเห็นตัวละครอยู่กลางแจ้ง ถ้าในความเป็นจริง มันควรจะต้องเกิดเงา เช่น เวลาเที่ยงพระอาทิตย์เหนือหัว มันจะต้องมีเงาบนหน้าของเราจากจมูกบ้าง ใต้ปากบ้าง แต่ในเกมนี้ไม่มี
Ray Tracing คืออะไร ?
ความสนุกมันอยู่ตรงนี้แหละ คือ เราอยากได้ความสมจริงของภาพมากขึ้น โดยเฉพาะ เรื่องแสงสีต่าง ๆ ที่เกิดขึ้น เทคโนโลยี Ray Tracing เข้ามาช่วยในเรื่องของความสมจริงของภาพได้มหาศาลมาก ๆ
หลักการของ Ray Tracing ง่ายมากคือ เราพยายามคำนวณเพื่อเลียนแบบการวิ่งของแสงจริง ๆ เหมือนที่เราคุยกันตอนแรกว่า Photon วิ่งจากแหล่งกำเนิดแสงมาชนกับวัตถุ ขึ้นกับพื้นผิวถ้ามันสะท้อนแสงได้ มันก็เด้งออกไปชนวัตถุอื่น ๆ ในพื้นที่ใกล้เคียง หรือกลับกันถ้าวัตถุนั้นดูดกลืนแสง มันจะหายไป แต่อย่างที่บอกว่า Photon ในฉากสักฉากไม่ได้มีแค่ 1, 10 หรือ 100 แต่มีเป็นล้าน ๆ ยังไม่นับว่า ถ้าในฉากมีวัตถุจำนวนมาก มีโอกาสที่ Photon จะไม่ได้เด้งแค่ 1 ครั้งแต่อาจเด้งไปเป็นพันหรือมากกว่าเลยทีเดียว
กลับกันทำให้ภาพที่ได้ออกมามีความสมจริง คล้ายกับภาพจริงมากกว่าเดิมมาก ๆ ยกตัวอย่างเช่น Animation อย่าง Minion เราจะเห็นว่า แสง และ เงา มีความสมจริงมาก ๆ
หรือย้อนกลับไป Animation เก่า ๆ เช่น A Bug's Life ออกมาในปี 1998 เป็นเรื่องแรก ๆ ที่ Pixar เริ่มใช้ Ray Tracing บางส่วนในการช่วยทำให้ภาพที่ได้ออกมามีความสมจริงมากขึ้น จนมาถึงปัจจุบันก็ยังมีการใช้อยู่เช่นเดิม
ดังนั้น เราจะเห็นว่าเทคโนโลยีการทำ Ray Tracing นั้นไม่ใช่เรื่องใหม่อะไร แต่เป็นเรื่องที่วงการ Animation เราทำกันมานานมาก ๆ 30 ปีกว่า ๆ ได้แล้ว แต่ทำไมมันพึ่งมาถูกพูดถึงในวงกว้างในช่วง 4-5 ปีที่ผ่านมาละ
Ray Tracing ไม่ใช่เรื่องง่าย
จริง ๆ แล้ว ที่เราบอกว่า วงการ Animation เขาใช้ Ray Tracing ในการสร้างมานานมาก ๆ แล้ว เขาทำบน Render Farm ขนาดใหญ่ที่ประกอบด้วย GPU หรือการ์ดจอมหาศาลมาก ๆ และ 1 Scene อาจจะใช้เวลาในการคำนวณ (Render) หลักวัน หรือมากกว่านั้นก็ไม่เสียหายอะไร จะคำนวณเยอะเท่าไหร่ เขารอได้ไม่เดือดร้อน
แต่... นั่นทำให้เทคโนโลยีนี้อยู่ในแค่ฝั่ง Animation ไม่ได้ก้าวเข้ามาสู่วงการเกม เพราะ ถ้าเราจะเอามาใช้ในการเล่นเกม เรากำลังพูดถึงการประมวลผลระดับ 60 FPS หรือก็คือ ใน 1 วินาที เราจะต้อง Render ได้ทั้งหมด 60 ภาพด้วยกัน เทียบกับที่เราบอกว่า ระดับ Animation เราคำนวณกัน 1 ภาพใช้เวลาหลักวันหรือมากกว่าด้วยซ้ำ ดังนั้น มันดูเป็นไปไม่ได้เลยสำหรับการที่เราจะเอา Ray Tracing มาใช้ในเกม หรือการประมวลผลตามเครื่องคอมพิวเตอร์ในบ้านทั่ว ๆ ไป
ทุกวันนี้เราใช้ Ray Tracing ทิพย์กัน
ปัญหาของการทำ Ray Tracing คือ ปริมาณแสงตกกระทบที่เราจะต้องคำนวณมันมีมากเกินไปที่ Hardware มันจะคำนวณได้ งั้นเราลองพยายามลดการตกกระทบของแสงที่เราจะคำนวณได้หรือไม่
คำตอบคือ ได้ แน่นอน ! ลักษณะของการใช้งานจริง ๆ เช่น พวก เกม หรือ Animation ต่าง ๆ เวลาเรามองเข้าไป เราจะมองผ่านมุมกล้อง ที่จะตั้งอยู่มุมเดียว หรือเราเรียกว่า เรามี Viewporrt เดียว บางครั้ง หรือส่วนใหญ่ เราจะไม่ได้เห็นทุกอย่างในฉากเดียวกัน ทำให้ถ้าเกิด เราให้เครื่องมาประมวลผลนั่งทำ Ray Trace ของสิ่งที่เราไม่เห็นใน Viewport มันก็ไม่มีผลอะไร ดังนั้น มันน่าจะเป็นส่วนที่ตัดได้ แต่เราทำยังไงละ
จากเดิม เราคิดจาก แหล่งกำเนิดแสง ตกกระทบ เด้งไปหาวัตถุอื่น ๆ แล้วเด้งเข้าตาเรา งั้นในเมื่อเราสนใจแค่สิ่งที่เราเห็น เราก็สามารถคิดกลับกันได้ คือ เราจะเริ่มคิดจาก Viewport หรือตาของเราย้อนกลับไปเรื่อย ๆ นี่แหละ คือเทคนิคที่เราใช้ลดปริมาณการคำนวณได้มหาศาลมาก ๆ
อีกปัญหาที่เราเล่าไปคือ แสงมันอาจตกกระทบ แล้วเด้งไปได้หลายครั้งมาก ๆ เช่น พันครั้งหรือมากกว่าก็เป็นได้ การเด้งแต่ละครั้ง หมายถึงการคำนวณมหาศาลมาก ๆ เลยมีสิ่งที่เรียกว่า Adaptive Depth Control ขึ้นมา เพื่อให้เครื่องหยุดคำนวณการเด้งของแสง เมื่อถึงจุดที่เหมาะสม จุดนี้เราไม่พูดถึงละกันว่าคำนวณยังไง เพราะเราก็ไม่ได้เรียนโดยตรงมา ฮ่า ๆ
ความสนุกมันมากขึ้นไปอีก เมื่อในยุคแรก ๆ ของการทำ Ray Tracing ตัว Hardware มันไม่ได้มีกำลังในการทำ Real-Time Ray Tracing สูงมากเท่าไหร่ จึงทำให้ แรก ๆ เราเลยไม่ได้มีเกมที่ใช้ Ray Tracing เต็ม ๆ ออกมา แต่ใช้เทคนิคลูกผสมด้วย การสร้างแสงและเงาแบบเดิม (Rasterisation) และใส่ Ray Tracing แค่บางส่วนของฉากเช่น วัตถุที่มีความเงา และ น้ำ ถามว่าแล้วรู้ได้ยังไงว่าวัตถุไหนต้องเอามาคำนวณ ง่ายมาก ๆ คือ Game Developer เขาฟิคไว้จากตอนเขียนแล้ว ตัวอย่างของเกมที่ใช้เทคนิคนี้คือ Battlefield V
พอ Hardware มันเร็วขึ้น เก่งขึ้น เราเริ่มขยับไปที่การให้ทุกวัตถุมันมีการสะท้อนแสงและเงาได้เต็ม ๆ แตกต่างจากช่วงแรกที่ฟิคไปแค่บางวัตถุ เราเรียกลักษณะการทำ Ray Tracing แบบนี้ว่า Global Illumination ตัวอย่างของเกมที่ Nvidia หยิบมาเล่าเยอะมาก ๆ คือ Metro Exodus ตอนนั้นบอกเลยว่า เราตื่นเต้นมากกับการที่เกมหยิบเทคนิคนี้มาเล่นกันแล้ว แต่แน่นอนว่า มันยังไม่สมบูรณ์มาก เพราะเขามีท่าที่ลดปริมาณ Ray หรือแสงที่เด้ง ๆ มา เช่น ถ้าวัตถุไหนมันมีแสงตกกระทบเยอะ เขาจะหยุดคำนวณ และเปลี่ยนให้จุดนั้นเป็นแหล่งกำเนิดแสงเอาเลย
มาในเกมใหม่ ๆ อย่าง Cyberpunk 2077 เรียกว่าเป็นลูกรักส์ Nvidia ในการเป็น Technological Showcase เลยก็ว่าได้ เกมนี้ใช้ทุกอย่างเกี่ยวกับ Ray Tracing ที่พึงมีในปัจจุบัน ใส่ Feature อย่างการทำ Full Ray Tracing หรือที่ Nvidia เรียกว่า Path Tracing คือแหล่งกำเนิดแสงที่จะคำนวณ Ray Tracing จะมีเท่าไหร่ก็ได้ ยิ่งรวมกับความเป็น Night City มีแสง Neon อยู่เต็มฉากไปหมด ทำให้ภาพที่ได้ดูสมจริงมากขึ้น มีความฟุ้ง ๆ ของแสง หรือ Ray Reconstruction ที่ใช้ AI ในการเดาการตกกระทบของแสง ล่นเวลาในการคำนวณการตกกระทบไปได้อีก
ดังนั้นสุดท้าย จริง ๆ ถ้าไม่นับเกมใหม่ ๆ ที่เป็น Showcase อย่าง Cyberpunk 2077 เอง เกมส่วนใหญ่จะไม่ได้ใช้ Ray Tracing แบบเต็ม ๆ เท่าไหร่ เรียกว่าเป็น Ray Tracing แบบทิพย์ ๆ ละกัน หรือกระทั่งในเกมใหม่ ๆ เอง ก็ยังไม่ได้ทำ Ray Tracing แบบเต็ม ๆ ในทุก ๆ เครื่อง เพราะมันจะทำให้เครื่องที่รองรับมันมีน้อยลงไป ไม่คุ้มกับการลงทุนอีก ถามว่าที่เราบอก Hardware ในการทำ Ray Tracing มันเก่งขึ้น จริง ๆ แล้วมันคืออะไรกัน
RT Core เบื้องหลังของการทำ Real-Time Ray Tracing
อย่างที่เราคุยกันมาทั้งบทความว่า การทำ Ray Tracing มันเป็นงานที่ใหญ่ ต้องการกำลังการประมวลผลที่สูงมาก ๆ มันสูงขนาดที่ว่า GPU ตัวแรงสุดเมื่อ 4-5 ปีก่อน รวมกับเทคนิคการลดจำนวน Ray ที่ใช้ในการประมวลผลแล้ว เรายังได้ไม่ถึง 60 FPS ซึ่งเป็น Standard Goal อยู่ดี ทำให้หลาย ๆ ค่าย เช่น Nvidia, AMD และ Apple เอง เริ่มเพิ่มหน่วยประมวลผลพิเศษ เพื่อทำงานพวกนี้โดยเฉพาะ
ในการทำ Ray Tracing มันมีไม่กี่สมการเท่านั้นในการคำนวณ เช่น Moller-Trumbore Intersection Algorithm และสมการที่เกี่ยวข้องอื่น ๆ อีกไม่เยอะมาก พวก Mathematics Operation หลัก ๆ จะไม่ต่างกันมากเท่าไหร่ ทำให้สามารถสร้างหน่วยประมวลผลพิเศษ ASIC (Application-Specific Integrated Circuit) ที่เกิดมาเพื่อคำนวณสมการพวกนี้โดยเฉพาะ ทำให้เราได้พลังในการคำนวณที่สูงมาก ๆ ในขณะที่มีขนาดเล็ก และ ใช้พลังงานได้อย่างมีประสิทธิภาพกว่ามาก ๆ
ใช่แล้วครับ เรากำลังอยู่ในยุคที่ เราอยากทำอะไรให้เร็วขึ้น เราก็ออกแบบ ASIC ยัดใส่เข้าไปเลย ตัวอย่างเช่น Nvidia GPU ตระกูล RTX มีการใส่ RT Core เข้ามาเพื่อเพิ่มประสิทธิภาพในการประมวลผลทางงาน Ray-Tracing ทำให้เราสามารถรันเกมที่ใช้ Ray Tracing ได้นั่นเอง
เวลาผ่านมาถึงเมื่อไม่กี่อาทิตย์ก่อนที่ Apple เปิดตัว A17 Pro เรื่องที่น่าสนุกคือ Apple เพิ่มหน่วยประมวลผลสำหรับการทำ Ray Tracing เข้ามาด้วย หลักการของมันจริง ๆ คล้าย ๆ กับ RT Core บน RTX GPU จาก Nvidia คือ การยัดหน่วยประมวลผลพิเศษเข้าไปเพิ่ม โดยที่ Apple เคลมว่า มัน Ray Tracing ได้เร็วกว่าเดิมถึง 4 เท่าเลยทีเดียว (แหงแหละ ยัดหน่วยประมวลผลเพิ่ม มันก็ต้องแรงกว่ายับ ๆ อยู่แล้ว)
สรุป
Ray Tracing เป็นเทคนิคในการประมวลผลแสงและเงาในเครื่องคอมพิวเตอร์โดยอาศัยพื้นฐานการเดินทางของแสงจากแหล่งกำเนิดแสงสะท้อนเข้าตาของเรา แต่การที่เราจะคำนวณแสงทั้งหมดที่ตกกระทบ และ เด้งไปมาในฉากของเรามันใช้พลังการประมวลผลสูงมาก สูงจน GPU ที่ใช้งานกันทั่ว ๆ ไปไม่สามารถทำแบบ Real-time หรือ 60 FPS ได้ง่าย ๆ ทำให้ฝั่งผู้ผลิต GPU พัฒนาวิธีการที่จะประมวลผลให้ได้ โดยอาศัย 2 ส่วนด้วยกันคือ เทคนิคการลดจำนวนแสงที่ต้องคำนวณรวมไปถึงการตกกระทบต่าง ๆ เพื่อลดปริมาณข้อมูลที่ต้องคำนวณออกไป และ หน่วยประมวลผลพิเศษที่เข้ามาทำให้การประมวลผลตรงนี้ ทำได้เร็วมากขึ้น มีประสิทธิภาพสูงขึ้นนั่นเอง การที่ Apple เอา Ray Tracing มาใส่ใน iPhone อาจจะยังไม่ได้ดีมาก แต่ถือว่าเป็นจุดเริ่มต้นที่ดีมาก ๆ สำหรับ Mobile Gaming ในยุคต่อไป