คำถามติดแท็ก shadow-mapping

1
เหตุใดการทำแผนที่เงาจึงเป็นมาตรฐาน
แม้ว่าฉันจะเป็นโปรแกรมเมอร์โดยการค้าขาย แต่ฉันก็แทบไม่ได้สัมผัสกับการพัฒนาเกมเลย ฉันมีคำถามนี้มาระยะหนึ่งแล้วและตอนนี้ฉันกำลังมองหาการพัฒนาเกมฉันคิดว่ามันจะเป็นช่วงเวลาที่ดีสำหรับการถาม เหตุใดการทำแผนที่เงาจึงเป็นวิธีที่พิเศษในการใช้เกมเพื่อสร้างเงา จะทื่อมันดูน่ากลัว แม้กระทั่งเกมที่ทันสมัยที่มีการตั้งค่าเงาสูงสุดมีเงาแบบ block-y ที่ทำให้เสียสมาธิมาก Doom 3 ทำเมื่อ 11 ปีที่แล้วใช้ปริมาณเงาที่ดูดีกว่าการใช้แผนที่เงาที่ฉันเคยเห็นซึ่งรวมถึงเกม AAA ที่เปิดตัวในสัปดาห์เดียวกันกับคำถามนี้ที่โพสต์ไว้ บุคคลที่สามดัดแปลงสำหรับ Doom 3 ทำให้ขอบเงาอ่อนลงทำให้พวกเขาน่าประทับใจยิ่งขึ้น มีปัญหาทางเทคนิคหรือข้อ จำกัด บางประการเกี่ยวกับการนำสิ่งต่าง ๆ เช่นปริมาณเงา? แผนที่เงานั้นง่ายต่อการนำไปใช้งานหรือไม่ที่ devs ไม่ได้พิจารณาเรื่องอื่นเลย? ข้อมูลเดียวที่ฉันสามารถค้นหาเกี่ยวกับเรื่องนี้คือรูปหลายเหลี่ยมที่ประกอบขึ้นเป็นเล่มอาจมีขนาดใหญ่มากขึ้นและมีความต้องการมากขึ้น บางทีปริมาณเงามีความต้องการของระบบที่สูงขึ้นมาก แต่ถ้าเป็นเช่นนั้นพวกเขาจะใช้มันอย่างไรในปี 2004? คำถามนี้ไม่เฉพาะเจาะจงกับการทำแผนที่เงากับปริมาณเงาพวกเขาเป็นเพียง 2 เดียวที่ฉันเคยเห็นใช้ในผลิตภัณฑ์เต็มรูปแบบและฉันไม่สามารถหาข้อมูลมากมายเกี่ยวกับเทคนิคอื่น ๆ ได้

1
สิ่งประดิษฐ์แผนที่เงา
ฉันต้องการลองเพิ่มเงาให้กับเกม 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สุดท้ายแผนที่เงาจะถูกดึงมาใช้ ส่วนที่เหลือของรหัสประกอบด้วยเพียงแค่ให้ค่าที่ถูกต้องให้กับเฉด หากจำเป็นฉันสามารถให้บริการได้เช่นกัน

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

2
แสงเงาคู่จุดพาราโบลาในการตั้งค่าแสงที่เลื่อนออกไป
ฉันได้ลองเล่นกับโค้ดตัวอย่าง / กวดวิชานี้ซึ่งแสดงให้เห็นถึงการติดตั้ง light-pre-pass อย่างง่ายซึ่งเป็นประเภทของการตั้งค่าแสงที่เลื่อนออกไป ฉันกำลังใช้การนำแสงเงาแบบชี้เข้ามาใช้แผนที่เงาคู่ ฉันทำตามคำอธิบายของ DPM นี้: http://gamedevelop.eu/en/tutorials/dual-paraboloid-shadow-mapping.htm ฉันสามารถสร้างแผนที่เงาและดูเหมือนว่าจะดูดี ฉันเชื่อว่าปัญหาปัจจุบันที่ฉันมีอยู่ในส่วนของพิกเซลที่มองหาค่าความลึกในแผนที่เงาเมื่อแสดงผลจุดไฟ นี่คือรหัสจุดแสงของฉัน: http://olhovsky.com/shadow_mapping/PointLight.fx ฟังก์ชั่น Pixel Shader PointLightMeshShadowPSที่น่าสนใจคือ ไม่มีใครเห็นข้อผิดพลาดที่จ้องมองในฟังก์ชั่นนั้น? หวังว่าใครบางคนเคยแก้ปัญหานี้มาก่อน :) ดังที่คุณเห็นในภาพด้านบนเงาของโพสต์ไม่ตรงกับตำแหน่งของโพสต์ดังนั้นการแปลงบางอย่างผิดปกติ ... นี่คือสิ่งที่ดูเหมือนว่าเมื่อแสงจุดใกล้มากกับพื้น (เกือบสัมผัสพื้นดิน) เมื่อแสงจุดเคลื่อนที่ใกล้กับพื้นดินเงาจะมารวมกันและสัมผัสไปตามเส้นที่แผนที่เงาทั้งสองมาบรรจบกัน (นั่นคือตามแนวระนาบที่กล้องแสงถูกพลิกเพื่อจับภาพแผนที่เงาทั้งสอง) แก้ไข: ข้อมูลเพิ่มเติม: เมื่อฉันย้ายจุดแสงให้ห่างจากจุดกำเนิดจะมีเส้นคู่ขนานกับเวกเตอร์ "ขวา" ของกล้องแสงที่จับเงา ภาพด้านบนแสดงผลลัพธ์ของการเลื่อนไฟจุดไปทางซ้าย ถ้าฉันย้ายไฟจุดไปทางขวาจะมีเส้นรูปวาดที่เทียบเท่ากันทางด้านขวาแทน ดังนั้นฉันคิดว่าสิ่งนี้บ่งชี้ว่าฉันกำลังเปลี่ยนแปลงบางอย่างในพิกเซลเชดเดอร์อย่างที่ฉันคิด แก้ไข: เพื่อให้คำถามนี้ชัดเจนยิ่งขึ้นนี่คือโค้ดบางส่วน นี่คือรหัสที่ฉันกำลังใช้การวาดเงาจุดไฟ วิธีนี้ใช้งานได้และใช้การจับคู่เงาตามที่คุณคาดหวัง VertexShaderOutputMeshBased SpotLightMeshVS(VertexShaderInput input) { VertexShaderOutputMeshBased output = (VertexShaderOutputMeshBased)0; output.Position = mul(input.Position, …

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

3
ปัญหาการแมปเงาครั้งแรก
ฉันใช้การทำแผนที่เงาพื้นฐานเป็นครั้งแรกใน OpenGL โดยใช้ shaders และฉันประสบปัญหาบางอย่าง ด้านล่างคุณสามารถดูตัวอย่างของฉากที่แสดงผลของฉัน: กระบวนการของการแมปเงาที่ฉันกำลังติดตามคือฉันแสดงฉากให้กับ framebuffer โดยใช้ View Matrix จากมุมมองแสงและเมทริกซ์การฉายและแบบจำลองที่ใช้สำหรับการเรนเดอร์ปกติ ในรอบที่สองฉันส่งเมทริกซ์ MVP ด้านบนจากมุมมองแสงไปยังตัวแบ่งจุดยอดซึ่งเปลี่ยนตำแหน่งเป็นพื้นที่แสง ส่วนของ shader จะแบ่งมุมมองและเปลี่ยนตำแหน่งเป็นพิกัดพื้นผิว นี่คือจุดสุดยอดของฉัน #version 150 core uniform mat4 ModelViewMatrix; uniform mat3 NormalMatrix; uniform mat4 MVPMatrix; uniform mat4 lightMVP; uniform float scale; in vec3 in_Position; in vec3 in_Normal; in vec2 in_TexCoord; smooth out vec3 pass_Normal; …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.