เงาในการเรนเดอร์


12

ฉันได้อ่านเนื้อหาบางส่วนเกี่ยวกับการเรนเดอร์ที่เลื่อนออกไปและฉันคิดว่าฉันได้รับส่วนสำคัญของมัน แต่สิ่งที่ฉันไม่เข้าใจคือวิธีการทำให้เงาสำเร็จ G-buffer เท่าที่ฉันทราบไม่เกี่ยวข้องกับการสร้าง shadowmap สำหรับแต่ละแสงดังนั้นฉันสับสนว่าการส่งผ่านแสงนั้นรับรู้ได้หรือไม่ว่าแต่ละพิกเซลนั้นถูกบดบัง ท้ายที่สุดพิกเซลที่กำหนดซึ่งมองเห็นได้จากมุมมองของกล้องอาจไม่สามารถมองเห็นได้จากมุมมองของแสงที่กำหนด - ซึ่งเรขาคณิตที่ปรากฎอาจไม่สามารถมองเห็นได้จากมุมมองของกล้องดังนั้นจึงไม่มีอะไรเขียนลงใน G-buffer .

หากคุณเริ่มต้นการเรนเดอร์ shadowmaps มันก็เหมือนกับการเรนเดอร์ไปข้างหน้าซึ่งคุณจะทำการเรนเดอร์เรขาคณิตทั้งหมดในที่เกิดเหตุเพื่อให้แสงในการเรนเดอร์ shadowmaps

ดังนั้นการเรนเดอร์ที่ได้รับจึงทำได้เงาที่เท่ากันกับการเรนเดอร์

คำตอบ:


14

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

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

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


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

6

แผนที่เงาคืออะไร? เงาแผนที่เป็นพื้นผิวที่ texels ตอบคำถามง่าย ๆ : สิ่งที่ระยะทางจากแสงไปตามทิศทางที่แสดงโดย texel แสงถูกบดบัง? พิกัดของพื้นผิวถูกสร้างขึ้นโดยใช้วิธีการเท็กซ์เจอร์ projective ต่างๆขึ้นอยู่กับอัลกอริทึมการแมปเงาเฉพาะ

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

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

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

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

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

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

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

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

แก้ไขปัญหา.


เป็นไปได้ไหมที่จะยกเว้นเรขาคณิตต่อแสงในการเรนเดอร์ที่เลื่อนออกไป (เพื่อประโยชน์สูงสุด)?
Samaursa

@ Samaursa: "ยกเว้นเรขาคณิตต่อแสง" จากอะไร จากการเข้าไปในแผนที่เงา? จากการถูกไฟ?
Nicol Bolas

ฉันเห็นคุณตอบคำถามเกี่ยวกับมันขอบคุณ สำหรับคนอื่น ๆ หากพวกเขาต้องการทำตามคำถาม / คำตอบ: gamedev.stackexchange.com/q/178755/2287
Samaursa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.