ทำไมบางเกมแสดงแสงไฟส่องทะลุกำแพง?


28

ในบางเกมฉันเห็นแสงไฟส่องผ่านผนังแม้ว่าฉันจะตั้งค่าคุณภาพวิดีโอในระดับสูง

ตัวอย่างของเกมที่ฉันเล่นเมื่อไม่นานมานี้คือ Borderlands 2 (ระเบิดขีปนาวุธ) และ Call of Cthulhu (ตะเกียง; เกมยังใช้ Unreal Engine 4)

นี่เป็นข้อบกพร่องหรือมีเหตุผลด้านประสิทธิภาพหรือไม่

ตัวอย่าง Borderlands 2: https://youtu.be/9bV83qA6_mU?t=419 (ไม่กี่ครั้ง แต่อย่างรวดเร็ว)

คำถามโบนัส: ในกรณีหลังมีการติดตาม ray ด้วยวิธีใดบ้างที่สามารถใช้ในการแก้ปัญหาได้อย่างถูก? ฉันเดาว่าแพง RT แก้ไขปัญหาได้แน่นอน แต่ฉันสงสัยว่ามันสามารถใช้ในรูปแบบ "ถูก" เพื่อแก้ปัญหาเฉพาะนี้ได้หรือไม่


21
รูปภาพมีมูลค่า 1,000 คำ
Evorlor

8
ฉันต้องไปเล่นเพื่อทดสอบ แต่จริง ๆ แล้วมันเป็นแสงที่รั่วผ่านหรืออาจเป็นผลกระทบของอนุภาคที่เรืองแสง? โดยเฉพาะอย่างยิ่งตัวอย่างของคุณจากการระเบิดของขีปนาวุธฉันสามารถจินตนาการถึงเอฟเฟกต์อนุภาค "ไฟ" ซึ่งน่าจะไม่สนใจการชน แลนเทิร์นสามารถทำเช่นเดียวกันเพื่อสร้างรัศมีที่มองเห็นได้ฉันคิดว่า ...
AC

@Evorlor เพิ่มหนึ่งตัวอย่าง
มาร์คัส

คำตอบ:


43

การขยายคำตอบที่ถูกต้องของ TomTsagk ฉันคิดว่ามันอาจช่วยอธิบายเพิ่มเติมได้อีกเล็กน้อยว่าทำไมเกมถึงทำงานเช่นนี้

แสงไฟในเกมไม่ได้ "เดินทาง" จากแหล่งกำเนิดสู่พื้นผิวไปยังกล้องถ่ายภาพสิ่งกีดขวางระหว่างทาง

ในการหาว่าความสว่างในการวาดแต่ละพิกเซลของพื้นผิวนั้นขึ้นอยู่กับแสงที่กำหนดเราใช้ (หรือโดยประมาณ) สูตรคณิตศาสตร์ที่ใช้ทิศทางหันหน้าของพื้นผิวและทิศทางจากจุดนี้บนพื้นผิวไปยังแหล่งกำเนิดแสง นั่นเป็นเพียงทิศทางที่ส่องแสงจาก - โดยทั่วไปเราจะไม่ทำการฉายแสงเพื่อตรวจสอบว่าแสงมาถึงพิกเซลนี้จริงหรือไม่เพราะการทำเช่นนั้นสำหรับทุกพิกเซลบนหน้าจอและตรวจสอบรังสีกับเรขาคณิตที่มีรายละเอียดทั้งหมดในฉาก มักจะยังแพงเกินไปสำหรับเกมเรียลไทม์

ดังนั้นโดยค่าเริ่มต้นไม่มีเกมส่องแสงเงา ทิศทางของแสงยังคงเหมือนเดิมแม้ว่าจะมีแสงเงาในทางคณิตศาสตร์ก็ให้ค่าความสว่างเท่ากัน

ถ้าเราต้องการจำลองเงาเราต้องทำมันแยกกัน วิธีหนึ่งที่พบได้ทั่วไปคือสิ่งที่เรียกว่า Shadow Map ในรุ่นนี้ก่อนที่เราจะแรเงาฉากของเราเราจะสร้างฉากจากมุมมองของแต่ละแสงราวกับว่าแสงนั้นเป็นกล้องเก็บความลึกของแต่ละพิกเซลที่มองเห็นเป็นพื้นผิวนอกจอ

จากนั้นเมื่อเราแรเงาฉากเราสามารถเปรียบเทียบระยะทางคณิตศาสตร์ของพิกเซลนี้จากแหล่งกำเนิดแสงเทียบกับความลึกที่เราบันทึกไว้ที่พิกเซลที่สอดคล้องกันในแผนที่เงา หากความลึกของแผนที่เงานั้นน้อยลงแสดงว่ามีอีกพื้นผิวระหว่างที่นี่กับแสงและเราวาดพิกเซลนี้เป็นเงาแทน

มีเทคนิคเจ๋ง ๆ มากมายที่จะทำให้เงามืดบนแผนที่ดูดีขึ้นโดยมีสิ่งประดิษฐ์ / นามแฝงน้อยลง แต่ตอนนี้ฉันจะเกลี้ยงเกลา พอจะพูดได้ว่าโดยทั่วไปแล้วพวกเขาจะไม่ฟรีเช่นกัน

เนื่องจากต้องมีการเรนเดอร์ (สูงสุด) ทั้งฉากอีกครั้งจากมุมมองของแสงแต่ละครั้ง - ถึงหกครั้งหากเป็นแสงไฟที่ส่องไปทุกทิศทาง {เหนือ, ใต้, ตะวันออก, ตะวันตก, ขึ้น, ลง} และเราต้อง - ให้แผนที่เงาทุกครั้งที่มีการเคลื่อนไหวสิ่งนี้อาจมีราคาแพงมาก

ดังนั้นเกมมักจะมุ่งเน้นงบประมาณการเรนเดอร์ไปกับแสงที่สำคัญที่สุดในฉาก - เช่นทิศทางแสงแดด - เพื่อให้แน่ใจว่าพวกเขามีเงาที่ดูดี ไฟเล็ก ๆ อายุสั้น ๆ อย่างแสงแฟลชจากการระเบิดมักจะให้อภัย บ่อยครั้งที่สิ่งนี้เป็นที่พอใจแก่ผู้เล่นมากกว่าการผูกปมในอัตราเฟรมเนื่องจากค่าใช้จ่ายในการเรนเดอร์ที่เพิ่มขึ้นอย่างฉับพลันจากการเรนเดอร์แผนที่เงาทั้งหมดและการคำนวณ โดยเฉพาะอย่างยิ่งถ้ามันเป็นฉากแอคชั่นที่วุ่นวายที่ความลื่นไหลสำคัญมากกว่าความสมบูรณ์แบบของพิกเซล


3
รอยย่นอีกอย่างก็คือในขณะที่มันไม่สำคัญที่จะคิดออกว่าแหล่งกำเนิดแสงอยู่ด้านหน้าหรือด้านหลังของพื้นผิวการป้องกันพื้นผิวที่ส่องแสงเมื่อส่องจากด้านหลังมักจะให้ผลลัพธ์ที่ดูแปลก ๆ
supercat

และนี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งกับผลกระทบของอนุภาค (ซึ่งการระเบิดน่าจะเป็นบางส่วนอย่างน้อย) เนื่องจากอนุภาคจะต้องมีราคาถูกเป็นพิเศษเพื่อให้มีประโยชน์มาก
Luaan

2
แสงและอนุภาคเป็นสองสิ่งที่แตกต่างกัน อนุภาคสามารถ "รั่วไหล" ผ่านสิ่งกีดขวางได้ แต่ด้วยเหตุผลที่ต่างกันโดยสิ้นเชิง บางครั้งระบบอนุภาคก็จะรวมแสงเพื่อช่วยในการขายเอฟเฟกต์ (คิดว่าแคมป์ไฟหรือฝูงหิ่งห้อย) แต่แสงที่อยู่ภายในเอฟเฟกต์ของอนุภาคยังเป็นเพียงแค่แสง
DMGregory

2
อีกทางเลือกหนึ่งสำหรับแผนที่เงาคือปริมาณเงาซึ่งแก้ไขปัญหานามแฝง แต่มีราคาแพงกว่า: ต้องการรูปเรขาคณิตเพิ่มเติม (รูปหลายเหลี่ยมใหม่ต่อขอบเงาของแต่ละวัตถุสำหรับแหล่งกำเนิดแสงแต่ละแหล่ง) เช่นเดียวกับการส่งผ่านพิเศษ ฉันคาดหวังว่าวิธีการทำแผนที่จะดีพอสำหรับสถานการณ์ส่วนใหญ่
DarthFennec

22

เรื่องสั้นสั้นสิ่งนี้เกิดขึ้นเนื่องจากเหตุผลด้านประสิทธิภาพ

เมื่อมีแสงสว่างบนหน้าจอโดยค่าเริ่มต้นจะส่องแสงบนวัตถุทั้งหมด (บดบังหรือไม่) ดังนั้นเกมจะต้องทำการคำนวณพิเศษเพื่อดูว่าวัตถุใดได้รับผลกระทบ

วิธีนี้ง่ายกว่าในการแก้ไขวัตถุคงที่โดยใช้แสงคงที่และอบ แต่ไม่เหมือนกันกับไฟแบบไดนามิกเช่นการระเบิดตามที่คุณระบุไว้

สำหรับคำถามโบนัสของคุณการติดตามเรย์และราคาถูกไม่รวมกันในประโยคเดียวกัน เหตุผลเดียวที่ทำให้การติดตามรังสียังไม่เกิดขึ้นจนถึงปัจจุบันคือประสิทธิภาพ สมมติว่าแสงทั้งหมดใช้การติดตามรังสีดังนั้นปัญหานี้จะ "แก้ไข" แต่ต้องเสียค่าใช้จ่ายในการปฏิบัติงาน


6
ดังนั้นการติดตามเรย์จึงเป็นเรื่องสำคัญสำหรับภาพยนตร์ CGI มากกว่าเกมเรียลไทม์
สะสม

21
@ การคำนวณว่าถูกต้อง เฟรมเดียวของภาพยนตร์สามารถใช้เวลาในการเรนเดอร์ชั่วโมงในขณะที่เกมมีเพียงมิลลิวินาทีเท่านั้น
NobodyNada - Reinstate Monica

16
ที่กล่าวว่าเกมกำลังสำรวจเพิ่มเติมโดยใช้ raytracing หรือ raymarching ควบคู่กับเทคนิคการแรสเตอร์ให้ปล่อยให้แรสเตอร์เซอร์ทำสิ่งที่ดีและรังสีทำสิ่งที่พวกเขาทำได้ดี มันไม่ได้เต็มทุกพิกเซล แต่คุณยังสามารถรับเอฟเฟกต์ที่ยอดเยี่ยมได้
DMGregory

2
@DMGregory แน่นอนว่าเกมอย่าง Duke Nukem 3D นั้นใช้ตัวแปรแบบง่าย ๆ ของ raytracing ถึงแม้ว่ามันจะไม่ได้ใช้สำหรับการให้แสงแบบไดนามิกและแน่นอนว่ามันไม่ได้ติดตามทุกพิกเซลเดียวบนหน้าจอ (โดยปกติแล้วมันทำสำหรับแต่ละคอลัมน์ จำนวนพิกเซล) และการสะท้อนกลับและความโปร่งใสยังคงเป็นกรณีพิเศษมากกว่าค่าเริ่มต้น ซอฟต์แวร์การเรนเดอร์ 3D ได้เล่นด้วยวิธีที่คล้ายกันเสมอมันเป็นฮาร์ดแวร์ 3 มิติที่ปิดตัวลงบนถนนสายนั้น (จนถึงปัจจุบัน)
Luaan

@Acccumulation Raytracing อยู่ในระดับที่แตกต่างกันดังนั้นในขณะที่เกมสามารถอยู่เหนือฮาร์ดแวร์บรรทัดยิงรังสีหลักพวกเขายังคงไม่ตีกลับรองเพียงพอหรือตีกลับหลายต่อพิกเซล ดังนั้นแม้ว่าคุณจะต้องฝึกฝนคุณก็ยังคงมีผลการปฏิบัติงานเช่นนี้ ดังนั้นความสามารถในการติดตามแสงหลักยังไม่ได้หมายความว่าคุณสามารถจ่ายไฟรองได้ทั้งหมด
joojaa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.