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

8
OpenGL, SFML และ SDL มีข้อได้เปรียบอะไรบ้างในการแสดงผลซอฟต์แวร์
ฉันเริ่มดูกระแส Handmade Heroที่ซึ่ง Casey Muratori สร้างเอ็นจิ้นเกมโดยไม่ต้องใช้เฟรมเวิร์กหรืออย่างนั้น เมื่อวานฉันไปถึงส่วนที่เขาแสดงให้เห็นว่าภาพวาดลงบนหน้าจออย่างไร เท่าที่ฉันเข้าใจเขาได้จัดสรรหน่วยความจำบางส่วนให้ใหญ่เท่ากับขนาดหน้าจอที่เขาต้องการวาด จากนั้นเขาสร้างบิตแมปที่เขาส่งไปยังหน่วยความจำบัฟเฟอร์ที่เขาจัดสรรและดึงมันไปที่หน้าจอโดยใช้ฟังก์ชั่นเฉพาะของระบบปฏิบัติการ นี่ดูเหมือนจะค่อนข้างตรงไปตรงมา ฉันใช้ GameMaker เปลี่ยนเป็น Love2D ทำงานเล็กน้อยกับ Sprite Kit แต่ฉันสงสัยอยู่เสมอว่าเกิดอะไรขึ้นภายใต้เลเยอร์นี้บางครั้งทำให้สับสน ระบุว่าทำไมแม้แต่ต้องใช้ห้องสมุดกราฟิก (OpenGL, SFML, SDL, ... ) เมื่อสิ่งที่คุณต้องทำคือเพียงจัดสรรบัฟเฟอร์บางส่วนผ่านบิตแมปและวาดลงบนหน้าจอ หากคุณต้องการวาดสิ่งที่แตกต่างให้กับหน้าจอคุณเพียงแค่เขียนลงในบิตแมปของคุณซึ่งจะถูกส่งผ่านไปยังบัฟเฟอร์ ฉันค่อนข้างใหม่กับการเขียนโปรแกรม แต่ดูเหมือนจะง่ายสำหรับฉัน โปรดแก้ไขฉันหากฉันผิด

3
การเรนเดอร์ซอฟต์แวร์ทำได้อย่างไร?
ฉันต้องการสำรวจแบบเรียลไทม์โดยใช้ซอฟต์แวร์แบบแรสเตอร์ ฉันรู้ว่าทุกอย่างกำลังมุ่งสู่ GPU ในทุกวันนี้ แต่มีบางเกมที่มันยังคงสมเหตุสมผลที่จะใช้ตัวแสดงซอฟต์แวร์ ตัวอย่างเช่น: Voxeltron Voxatron เป็นเกมยิงที่เกิดขึ้นในโลกที่ทำจาก voxels (ก้อนเล็ก ๆ ชนิดหนึ่ง) ทุกอย่างในเกมนั้นจะแสดงในรูปแบบเสมือน 128x128x64 voxel รวมถึงเมนูและรายการเล่นของผู้เล่น หากคุณมองอย่างใกล้ชิดบางครั้งคุณสามารถเห็นสินค้าคงคลัง (คะแนน / ชีวิต / กระสุน) หล่อเงาบนวัตถุบางอย่างบนพื้น ฉันทำงานเกี่ยวกับการแสดงผล voxel และเครื่องมือสร้างแบบจำลองมาเป็นเวลานานโดยมีเป้าหมายสูงสุดในการสร้างเกมผจญภัยสำรวจขนาดใหญ่ ประมาณครึ่งปีที่แล้วมันถูกหลอมรวมกับงานที่ฉันทำกับนักยิงเวทีสำหรับ Conflux และนี่คือผลลัพธ์ มันเป็นเกมที่เล่นง่ายในใจ - ส่วนใหญ่เป็นเพียง Robotron ที่ตั้งอยู่ในโลก 3 มิติที่ถูกทำลายด้วยสิ่งมีชีวิตที่โง่เขลา ฉันไม่แน่ใจว่าความสำคัญของการทำลายล้างจะเป็นอย่างไรต่อการเล่นเกม แต่มันก็สนุกดีที่จะทำลายกำแพงบางส่วน ฉันยังเพิ่มรถปิคอัพสร้างกำแพงที่คุณสามารถใช้เพื่อสร้างกำแพงเพื่อซ่อนจากมอนสเตอร์ที่น่ากลัว เกมจะเกิดขึ้นในชุดเล็ก ๆ โดยสิ้นเชิง บางห้องมีห้องที่มีฉากแอ็คชั่นอยู่ระหว่าง Knightlore และ Smash TV นี่คือบางส่วนของการออกแบบตามการผจญภัยดั้งเดิมแอบกลับมาและข้อแก้ตัวในการสร้างสภาพแวดล้อมเฉพาะเรื่อง คุณสมบัติ: …

4
ทำไมคุณถึงใช้การเรนเดอร์ซอฟต์แวร์ผ่านการเรนเดอร์ฮาร์ดแวร์ในวันนี้
ตรงข้ามกับการแสดงผล CPU หรือซอฟต์แวร์ฉันถือว่า? โดยทั่วไปแล้วการแสดงผลในปัจจุบันทั้งหมดจะเป็นไปตาม GPU ใช่ไหมว่าคุณจะใช้ OpenGL หรือ Direct X มีคนให้ข้อมูลฉันที่นี่ไม่พบคำตอบที่เหมาะสมหรือไม่

2
รายละเอียดของ GPU ทำอะไรได้จริงเมื่อตัดในพื้นที่ที่เป็นเนื้อเดียวกัน 4D?
ฉันเรียนรู้ไปป์ไลน์เรนเดอร์ที่สามารถตั้งโปรแกรมได้โดยการใช้เรนเดอร์ซอฟต์แวร์ตัวเล็ก ๆ ฉันพยายามใช้มันในรูปแบบ 'ฮาร์ดแวร์' อย่างไรก็ตามฉันไม่คุ้นเคยกับขั้นตอนการทำงานของ GPU และมีปัญหาในการตัดเป็นเนื้อเดียวกัน พื้นที่การตัดที่เป็นเนื้อเดียวกันประกอบด้วยตัวแปรwซึ่งมีความหลากหลายในแต่ละจุดยอด พิกัดจุดที่เป็นเนื้อเดียวกันของวัตถุแต่ละอัน (ระหว่างเมทริกซ์การฉายและการหารแบบเอกพันธ์ด้วย w) ที่พื้นที่การตัดของมันหรือไม่? ถ้าเป็นเช่นนั้นวิธีการตัดเส้นและสามเหลี่ยมใกล้กว่า Frustum หรือยืดตัวกล้อง (เช่น w <= frustum_znear)? ปรับปรุง : กระทู้นี้บอกว่าการตัดในพื้นที่ที่เป็นเนื้อเดียวกันนั้นเป็นปัญหาการแยกโดยตรงในพื้นที่ที่เป็นเนื้อเดียวกัน 4D p_vec4 = t * point1_vec4 + (1 - t) * point2_vec4ซึ่งหมายความว่าจุดตัดคือ บอกว่าฉันมีP0(-70, -70, 118, 120)และP1(-32, -99, -13, -11)ในพื้นที่ที่เป็นเนื้อเดียวกัน 4D และจุดตัดกับplane w = -z(ซึ่งใน NDC คือ z = …

1
การแก้ไขความลึกสำหรับบัฟเฟอร์ z กับ scanline
ฉันต้องเขียนซอฟต์แวร์ 3d rasterizer ของตัวเองและจนถึงตอนนี้ฉันสามารถฉายโมเดล 3 มิติของฉันที่สร้างจากรูปสามเหลี่ยมลงในพื้นที่ 2d: ฉันหมุนแปลและฉายจุดเพื่อให้ได้พื้นที่ 2 มิติของสามเหลี่ยมแต่ละอัน จากนั้นฉันใช้จุดสามเหลี่ยม 3 จุดและใช้อัลกอริธึม scanline (โดยใช้การแก้ไขเชิงเส้น) เพื่อค้นหาทุกจุด [x] [y] ตามขอบ (ซ้ายและขวา) ของรูปสามเหลี่ยมเพื่อให้ฉันสามารถสแกนสามเหลี่ยมในแนวนอนได้ เรียงต่อกันแล้วเติมด้วยพิกเซล วิธีนี้ใช้ได้ผล ยกเว้นฉันต้องใช้ z-buffering ด้วย ซึ่งหมายความว่าการรู้พิกัด z ที่หมุนและแปลของจุดยอด 3 จุดของรูปสามเหลี่ยมฉันต้องแก้ไขพิกัด z สำหรับจุดอื่น ๆ ทั้งหมดที่ฉันพบด้วยอัลกอริทึมสแกนไลน์ของฉัน แนวคิดดูเหมือนชัดเจนพอแรกพบ Za และ Zb ด้วยการคำนวณเหล่านี้: var Z_Slope = (bottom_point_z - top_point_z) / (bottom_point_y - top_point_y); …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.