สิ่งประดิษฐ์แผนที่เงา


16

ฉันต้องการลองเพิ่มเงาให้กับเกม 3D XNA ฉันได้ตั้งค่าสภาพแวดล้อมการทดสอบด้วยแสงเดียวและกล้องหนึ่งตัว อย่างไรก็ตามฉันพบสิ่งประดิษฐ์ด้วยวิธีการของฉัน

ฉันใช้รหัส shader จากhttp://pastebin.com/zXi0hmsUเพื่อแสดงผลลัพธ์สุดท้ายและ http://pastebin.com/rY4Gcj9Nเพื่อสร้างแผนที่เงา รหัสตรงไปตรงมาและเกี่ยวข้องกับการผลิตความลึกจากมุมมองของแสงจากนั้นฉายลงในพื้นที่กล้องและตรวจสอบเพื่อหาข้อสรุป

อย่างไรก็ตามจากมุมส่วนใหญ่ฉันได้ผลลัพธ์ที่น่าเกลียดเหมือนในภาพหน้าจอนี้

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

RenderTarget ของฉันสำหรับแผนที่เงาถูกเตรียมใช้งานโดย

int shadowMapSize = 512;
RenderTarget2D shadowMap = new RenderTarget2D(GraphicsDevice, shadowMapSize,
    shadowMapSize, true, GraphicsDevice.PresentationParameters.BackBufferFormat,
    DepthFormat.Depth24Stencil8);
GraphicsDevice.SetRenderTarget(shadowMap);
GraphicsDevice.Clear(Color.White);
GraphicsDevice.DepthStencilState = DepthStencilState.Default;

หลังจากนั้นCreateShadowMapจะใช้เอฟเฟกต์ตามด้วยเอฟเฟกต์ LambertWithShadows SpriteBatchสุดท้ายแผนที่เงาจะถูกดึงมาใช้

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

คำตอบ:


19

ปัญหานี้เป็นปัญหาทั่วไปที่เรียกว่าเงาแผนที่สิว เกิดจากพิกเซลที่ฉายของแผนที่เงา (ความลึก) มีขนาดใหญ่กว่าพิกเซลบนหน้าจอ (eq. ไม่สามารถแสดงความลึกได้อย่างถูกต้อง)

ป้อนคำอธิบายรูปภาพที่นี่

มีวิธีแก้ไขปัญหานี้มากมาย สิ่งแรกที่ง่ายที่สุดคืออคติ (ฉันเห็นในรหัสของคุณดังนั้นจึงไม่ใช่ปัญหา) และวิธีที่สองที่ง่ายคือแผนที่เงาที่มีความละเอียดมากกว่าจริง ๆ แล้วมันเป็นเรื่องปกติมากกว่าที่จะมี shadowmaps ในความละเอียด 2048x2048 ใน hw ปัจจุบัน(แก้ไข: ไม่จริงฉันเขียนว่าเมื่อฉันทำงานเกี่ยวกับการเรนเดอร์ภาพยนตร์ในการพัฒนาเกมคุณต้องการทำให้แผนที่เงามีขนาดเล็กที่สุดเท่าที่จะทำได้)

ทรัพยากรบางอย่างเพื่อศึกษาเทคนิคขั้นสูงเพิ่มเติม


แก้ไข:


ฉันมีเนื้อหาเพิ่มเติมเกี่ยวกับหัวข้อนี้ในงานถ้าคุณสนใจฉันจะแบ่งปันด้วย
Notabene

ปัญหาหลักที่มีความละเอียดมากคือในตอนท้ายเกมฉันมีไฟประมาณ 3-4 ดวงซึ่งไม่ได้บอกทิศทาง => ฉันจะต้องใช้แผนที่ลูกบาศก์เงาที่นั่นซึ่งส่งผลให้ 24 shadowmaps หากคุณมีเนื้อหาเพิ่มเติมฉันจะขอบคุณความพยายามของคุณในการแบ่งปันกับฉัน :-)
Etan

ฉันสนใจอย่างน้อยที่สุดถ้าเรื่องนั้นสำคัญ :)
James

1
@Etan ใช่ทุกทิศทางไฟเป็นความเจ็บปวดที่แท้จริงถ้าพูดถึงเงา (ฉันรู้อะไรเกี่ยวกับมัน :) gamedev.stackexchange.com/questions/6203/… ) ลองใช้แผนที่คู่แบบพาราโบลา หรือถ้าคุณชอบ cubemaps ลองประหยัดพื้นที่ด้วยการแยก frustum-camera_frustum สำหรับทุกหน้า / เรนเดอร์ คุณไม่จำเป็นต้องมีเงาสำหรับทุกทิศทางตลอดเวลา (โดยเฉพาะอย่างยิ่งในการตกแต่งภายนอก)
Notabene

1
@Etan @James ฉันได้เพิ่มสิ่งอื่น ๆ ให้กับคุณ ทั้งคู่มีค่าควรอ่านหากคุณสนใจในหัวข้อนี้
Notabene
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.