คำถามติดแท็ก deferred-rendering

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

3
การเรนเดอร์คืออะไร
ฉันได้ยินเกี่ยวกับการเรนเดอร์ที่เลื่อนออกไปและวิธีการใช้งานที่สามารถอนุญาตสำหรับ "ล็อต" ของแสงในฉากที่ไม่มีการแสดงยอดเยี่ยม แต่มันคืออะไรและ (จากระดับสูง) มันนำไปใช้อย่างไร?

1
การออกแบบเครื่องมือเกม - Ubershader - การออกแบบการจัดการ Shader [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน2 ปีที่ผ่านมา ฉันต้องการใช้ระบบ Ubershader ที่ยืดหยุ่นด้วยการแรเงาที่เลื่อนออกไป ความคิดปัจจุบันของฉันคือการสร้างความแตกต่างจากโมดูลซึ่งจัดการกับคุณสมบัติบางอย่างเช่น FlatTexture, BumpTexture, Displacement Mapping เป็นต้นนอกจากนี้ยังมีโมดูลขนาดเล็กที่ถอดรหัสสีทำการแมปโทนและอื่น ๆ ซึ่งมีข้อดีที่ฉันสามารถ แทนที่โมดูลบางประเภทหาก GPU ไม่รองรับดังนั้นฉันสามารถปรับให้เข้ากับความสามารถของ GPU ในปัจจุบัน ฉันไม่แน่ใจว่าการออกแบบนี้ดีหรือไม่ ฉันกลัวว่าฉันจะเลือกได้ไม่ดีตอนนี้และจ่ายเงินในภายหลัง คำถามของฉันคือฉันจะหาแหล่งข้อมูลตัวอย่างบทความเกี่ยวกับวิธีการนำระบบการจัดการ shader ไปใช้ได้อย่างมีประสิทธิภาพได้อย่างไร ไม่มีใครรู้ว่าเอ็นจิ้นเกมใหญ่ทำเช่นนี้ได้อย่างไร

2
เทคนิคการเพิ่มประสิทธิภาพการเรนเดอร์ทั่วไปสำหรับเรขาคณิตผ่านในเรนเดอร์แรเงาที่เลื่อนออกไปเป็นอย่างไร [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน6 ปีที่ผ่านมา ฉันพัฒนาเครื่องมือเกมโดยใช้ OpenGL 3 และ C ++ (และ glfw สำหรับการจัดการหน้าต่าง) ฉันได้ก้าวหน้าไปแล้วทำสิ่งต่าง ๆ ให้เสร็จยกเว้นเสียงและการปรับให้เหมาะสมที่สุด เอ็นจิ้นใช้การแรเงาที่เลื่อนออกไปดังนั้นเนื่องจากการแรเงาที่เลื่อนออกไปนั้นเป็นกระบวนการที่น่าเบื่อสำหรับ GPU โดยเฉลี่ยฉันต้องการเพิ่มประสิทธิภาพของกระบวนการเรนเดอร์ให้มากที่สุด ระบบปัจจุบันประกอบด้วยฉากที่มี Renderer std::vectorsและโลกปัจจุบันและโลกถือหน่วยงานและหน่วยงานที่แยกออกจากแสง ดังนั้นโดยทั่วไปทุกครั้งที่ซีนถูกเรียกโดย->render()และมันเรียกว่า Renderer ผ่านโลกเป็นพารามิเตอร์และรับเอนทิตีซ้ำจากทั่วโลกดึงพวกมันไปยัง FBO จากนั้นผ่านหน่วยแสงสำหรับการผ่านครั้งที่สอง และฉันคิดว่ามันไม่เพียงพอ อัลกอริทึมปัจจุบันของฉันวนซ้ำทุกอย่างแม้ว่าเอนทิตีไม่ได้อยู่ในพื้นที่หน้าจอ ฉันกำลังคิดหาวิธีเพิ่มประสิทธิภาพอัลกอริธึมการแสดงผลปัจจุบันดังนั้นจึงเรียกเฉพาะฟังก์ชัน API เฉพาะสำหรับวัตถุที่มองเห็นดังนั้นเทคนิคทั่วไปในการปรับการแสดงผลให้เหมาะสมคืออะไร

1
ไม่ได้ผลลัพธ์ที่ต้องการด้วยการใช้ SSAO
หลังจากนำการเรนเดอร์มาใช้แล้วฉันลองเสี่ยงโชคด้วยการใช้ SSAO โดยใช้บทช่วยสอนนี้ น่าเสียดายที่ฉันไม่ได้รับสิ่งที่ดูเหมือน SSAO คุณสามารถดูผลลัพธ์ของฉันด้านล่าง คุณสามารถเห็นได้ว่ามีลวดลายแปลก ๆ บางอย่างและไม่มีเงาบังแดดที่จะต้องมี (เช่นระหว่างวัตถุและบนพื้นดิน) เฉดสีที่ฉันติดตั้งมีดังนี้: #VS #version 330 core uniform mat4 invProjMatrix; layout(location = 0) in vec3 in_Position; layout(location = 2) in vec2 in_TexCoord; noperspective out vec2 pass_TexCoord; smooth out vec3 viewRay; void main(void){ pass_TexCoord = in_TexCoord; viewRay = (invProjMatrix * vec4(in_Position, 1.0)).xyz; gl_Position …

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

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

2
การแรเงาแบบเรียงต่อกันของกระเบื้องการคำนวณ frusta ของกระเบื้องใน OpenGL
ฉันพยายามแรเงาแบบเรียงต่อกันบนกระเบื้องใน OpenGL โดยใช้ตัวประมวลผล แต่ฉันได้รับอุปสรรคเมื่อพยายามสร้าง frustum สำหรับแต่ละไทล์ ฉันใช้การสาธิตฟอร์เวิร์ด + ของ AMD (เขียนใน D3D) เป็นแนวทาง แต่ดูเหมือนว่าไฟจะถูกกำจัดเมื่อพวกเขาไม่ควร UPDATE อ่านด้านล่างสำหรับการปรับปรุง นี่คือ shader การคำนวณของฉัน (สมบูรณ์): #version 430 core #define MAX_LIGHTS 1024 #define MAX_LIGHTS_PER_TILE 40 #define WORK_GROUP_SIZE 16 struct PointLight { vec3 position; float radius; vec3 color; float intensity; }; layout (binding = 0, rgba32f) uniform …

1
ปัญหาปกติที่สติ๊กเกอร์ค้างไว้
ฉันทำงานกับระบบรูปลอกที่รอการตัดบัญชี จนถึงตอนนี้ฉันได้ฉายส่วนที่เสร็จแล้วซึ่งหมายความว่าฉันสามารถคลิกที่บางสิ่งบางอย่างในฉากและมันจะฉายภาพรูปลอกบนพื้นผิวของวัตถุ มีอีกสองสิ่งที่ฉันต้องการเพิ่มในระบบนี้: การตัดปกติและสติ๊กเกอร์แมปปกติ การตัดปกติคือเมื่อฉันทิ้งชิ้นส่วนที่ทอดข้ามมุมคม การกระทำที่นี่ วิธีการแก้ปัญหานี้คือการทิ้งเศษชิ้นส่วนที่มีความแตกต่างอย่างมากระหว่างค่าปกติใน G-Buffer และค่าปกติของรูปลอก สิ่งนี้จะต้องมีการอ่านพื้นผิวปกติของ G-buffer ในการทำการแมปปกติของรูปลอกฉันต้องผสมผสานปกติของรูปลอก (จากแผนที่ปกติ) กับ G-บัฟเฟอร์ของปกติ ต้องเขียนไปยังพื้นผิวปกติของ G-buffer ฉันหวังว่ามันชัดเจนว่าเพื่อรองรับคุณสมบัติทั้งสองนี้ฉันต้องอ่านและเขียนลงบนพื้นผิวปกติใน shader pass เดียวกัน น่าเศร้านี่คือพฤติกรรมที่ไม่ได้กำหนดดังนั้นฉันสงสัยว่ามีวิธีอื่นที่จะใช้คุณสมบัติเหล่านี้

1
เหตุใดจึงสำคัญที่ต้องแสดงเป้าหมายด้วยขนาดบิตเดียวกัน
ฉันกำลังคิดว่า GBuffer ประเภทใดที่ฉันจะต้องใช้สำหรับการแรเงาที่เลื่อนออกไปดังนั้นฉันจึงพยายามจัดทำเอกสารออนไลน์ด้วยตนเองเกี่ยวกับสิ่งที่พบบ่อยที่สุดและรูปแบบของพวกเขา GBuffer ส่วนใหญ่ที่ฉันเคยเห็นใช้ขนาดบิตเดียวกันสำหรับแต่ละเป้าหมายการแสดงผลซึ่งนำไปสู่ช่องที่ไม่ได้ใช้ อย่างไรก็ตามในการเดาแรกสำหรับ GBuffer ของฉันบนกระดาษฉันต้องการสองเป้าหมาย 24 บิตและสอง 32 คนหรือสาม 24 และหนึ่ง 32 ฉันเข้าใจว่าการมีขนาด "สิ่งที่แนบ" เหมือนกันสามารถจัดแนวได้ดีกว่า แต่ในทางปฏิบัติแล้วมันจะดีกว่าถ้าจะเสียช่องสัญญาณ (หรือสำรองไว้เพื่อใช้ในอนาคต) และมี RTs ขนาดเท่ากันหรือควรใช้สิ่งที่ต้องการ ในกรณีก่อนหน้านี้ทำไมมันถึงได้เปรียบเช่นนั้นบิต 24 บิตจะถูกเพิ่มเป็น 32 หรือไม่?

2
พื้นผิว Projective และแสงรอการตัดบัญชี
ในคำถามก่อนหน้านี้ฉันถามว่าเป็นไปได้ไหมที่จะทำพื้นผิวแบบ Projective ด้วยแสงที่เลื่อนออกไป ตอนนี้ (มากกว่าครึ่งปีต่อมา) ฉันมีปัญหากับการใช้งานสิ่งเดียวกัน ฉันพยายามที่จะใช้เทคนิคนี้ในการส่งผ่านแสง (โปรเจ็กเตอร์ของฉันไม่มีผลต่ออัลเบโด้) ฉันมีโปรเจ็กเตอร์นี้ดูเมทริกซ์การฉาย: Matrix projection = Matrix.CreateOrthographicOffCenter(-halfWidth * Scale, halfWidth * Scale, -halfHeight * Scale, halfHeight * Scale, 1, 100000); Matrix view = Matrix.CreateLookAt(Position, Target, Vector3.Up); สถานที่halfWidthและhalfHeightเป็นครึ่งหนึ่งของความกว้างและความสูงของพื้นผิวPositionคือตำแหน่งของโปรเจ็กเตอร์และtargetเป็นเป้าหมายของโปรเจ็กเตอร์ ดูเหมือนว่าจะโอเค ฉันกำลังวาดรูปสี่เหลี่ยมเต็มหน้าจอด้วย shader นี้: float4x4 InvViewProjection; texture2D DepthTexture; texture2D NormalTexture; texture2D ProjectorTexture; float4x4 ProjectorViewProjection; sampler2D depthSampler = …

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, …

3
การแรเงาที่เลื่อนออกไป - วิธีรวมแสงหลายดวงเข้าด้วยกัน?
ฉันเริ่มต้นด้วย GLSL และฉันได้ใช้การแรเงาที่เลื่อนออกไปอย่างง่ายซึ่งจะส่งออก G-buffer ด้วยตำแหน่ง, ค่าพื้นฐานและอัลเบโด้ ฉันยังเขียน shader แสงจุดง่ายเช่นกัน ตอนนี้ฉันวาดทรงกลมสำหรับจุดไฟและเอาท์พุทไปที่บัฟเฟอร์แสง ปัญหาคือฉันจะรวมผลลัพธ์ของบัฟเฟอร์แสงเมื่อวาดแสงหลายดวงได้อย่างไร เช่นเมื่อฉันวาดแสงที่สองไปยัง lightbuffer โดยใช้ shader แสงจุดฉันจะเพิ่มแสงแรกในแสงที่สองในบัฟเฟอร์แสงได้อย่างไร ฉันหมายความว่าคุณไม่สามารถอ่านและเขียนไปยังบัฟเฟอร์เอาต์พุตเดียวกันได้หรือไม่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.