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


12

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

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

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

แก้ไข : แอปพลิเคชันของฉันใช้ฟังก์ชั่นความหนาแน่นเพื่อเป็นตัวแทนของรูปทรงเรขาคณิต ฟังก์ชันมีค่าที่แต่ละจุดในอวกาศ ฉันแบ่งส่วน frustum ของกล้องออกเป็นกริด 3 มิติแต่ละบล็อกสามารถฉายเป็นพิกเซลได้ ในแต่ละบล็อกฉันรวมฟังก์ชั่นความหนาแน่นและตรวจสอบว่ามีค่ามากกว่าค่าที่ต้องการหรือไม่ ถ้าใช่จะมีการสันนิษฐานว่ามีบางสิ่งในบล็อกนั้นและพิกเซลที่สอดคล้องกับบล็อกนั้นมีการแสดงผล ดังนั้นตอนนี้ในโหมดแสดงภาพของฉันฉันต้องการส่งผ่านฟังก์ชั่น (ซึ่งฉันแทนด้วยสตริง) ไปยังฮาร์ดแวร์กราฟิกแทนข้อมูลจุดยอดในบัฟเฟอร์จุดสุดยอด นี่ก็หมายความว่าจุดสุดยอด shader จะไม่มีจุดยอดในการแปลงเป็น homogeniouse พื้นที่คลิปและชิ้นส่วน shader ไม่ได้รับข้อมูลพิกเซล แต่ในขณะนี้การค้นหาและการประเมินผลส่วนใหญ่เกิดขึ้นต่อพิกเซลแทน


'ฟังก์ชั่นความหนาแน่นของฟังก์ชั่น' เป็นคำซ้ำซากหรือไม่?
Pharap

@Phap นั่นเป็นตัวพิมพ์ผิด "desity functon" ซึ่งเป็นตัวแทนของการปรากฏตัวของ "สสาร" ในอวกาศ
แสงไฟ

2
ดูเหมือนว่าคุณแค่ต้องการสร้างหน้าตา isosurface ซึ่งเป็นปัญหาที่ศึกษามาอย่างดี คุณเคยเห็นhttp.developer.nvidia.com/GPUGems3/gpugems3_ch07.htmlหรือค้นหา Metaballs การสร้างภาพจุดบนคลาวด์การสกัดแบบ isosurface หรือการแสดงปริมาณหรือไม่ นอกจากนี้คุณต้องการประสิทธิภาพแบบใดซึ่งจะสร้างความแตกต่างอย่างมากในการเลือกเทคนิคที่คุณค้นหาเมื่อรวมกับความซับซ้อนของการคำนวณของคุณ ฉันคิดว่าคุณจะพบว่าต่อพิกเซลจะทำให้เกิดประกายเมื่อกล้องเคลื่อนไหวและจำเป็นต้องใช้พิกเซลย่อย
Patrick Hughes

คำตอบ:


18

คุณสามารถใช้ GPU เพื่อแสดงข้อมูลปริมาตร

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

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

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

BTW อาจสนใจให้คุณอ่านRendering Worlds ด้วย Two TrianglesโดยIñigoQuílezซึ่งเป็นคำบรรยายที่อธิบายถึงวิธีการสร้างฉาก 3 มิติที่ประกอบด้วยฟังก์ชั่นทางคณิตศาสตร์ (โดยเฉพาะฟิลด์ระยะทาง) โดยใช้เทคนิค shader พิกเซลแบบเต็มหน้าจอ


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

ฉันสงสัยว่าคุณต้องการลองใช้ parser และ / หรือภาษาในฟังก์ชั่นการใช้งานตามอำเภอใจของ GPU ซึ่งอาจจะน่าอึดอัดใจเนื่องจาก GPU นั้นไม่ใช่วัตถุประสงค์ทั่วไป เป็นไปได้ว่าคุณต้องการสร้าง shader แบบไดนามิกในโค้ดหลักของคุณจากนั้นให้ระบบกราฟิกรวบรวมและเรียกใช้ shader ที่เกิดขึ้น
Patrick Hughes

@TheLightSpark ถูกต้องคุณจะไม่ส่งผ่านสตริงไปยัง shader (ภาษาที่แรเงาไม่มีประเภทสตริง) คุณต้องการสร้างและรวบรวมรหัส shader สำหรับฟังก์ชั่นที่คุณต้องการ สามารถทำได้ที่ runtime ถ้าจำเป็น
นาธานรีด

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

@danijar ใช่มันมีข้อได้เปรียบเล็กน้อยในการใช้รูปสี่เหลี่ยมเพราะพิกเซลบางส่วนในแนวทแยงจะมีเงาสองครั้งหากคุณใช้รูปสี่เหลี่ยมเต็มหน้าจอ ในทางกลับกันการทิ้งพิกเซลนอกหน้าจอนั้นฟรีเนื่องจาก rasterizer จะไม่สร้างพิกเซลเหล่านั้นเพื่อเริ่มต้น
นาธานรีด

6

การติดตามเรย์และเทคนิคอื่น ๆ มักทำด้วย Compute Shaders ซึ่ง Direct3D ได้รับการสนับสนุนตั้งแต่การเปิดตัว D3D11 และ OpenGL ได้รับการสนับสนุนตั้งแต่ 4.3 (และอีกต่อไปผ่านการใช้ OpenCL และการตั้งค่าบางอย่าง)


5

ฟังดูเหมือนคุณต้องการใช้ GPU คำนวณ shader หรือใช้วัตถุ "Shader Storage Buffer" เพื่อช่วยเพิ่มขั้นตอนการทำงานให้เหมาะกับความต้องการของคุณ นักคณิตศาสตร์นักวิทยาศาสตร์และคนอื่น ๆ ที่มองหา GPU สำหรับการคำนวณในสิ่งที่ไม่แปลเป็นกราฟิกมาตรฐานใช้สิ่งนี้

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

http://community.arm.com/groups/arm-mali-graphics/blog/2014/04/17/get-started-with-compute-shaders

หากสิ่งนี้ไม่ได้ชี้ให้คุณไปในทิศทางที่ถูกต้องคุณจะช่วยขยายแนวคิดของคุณที่ไม่เหมาะสมกับกระบวนทัศน์จุดสุดยอด / ชิ้นส่วนหรือไม่?


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