มีวิธีใดบ้างที่จะสร้างสิ่งดั้งเดิมในรูปทรงเรขาคณิตที่ไม่มีเรขาคณิตอินพุตใด ๆ ?


17

ไม่กี่ปีที่ผ่านมาผมพยายามที่จะใช้นี้ GPU อัญมณีใน OpenGL ในการสร้างกระบวนการภูมิประเทศ 3 มิติโดยใช้วงก้อน บทความแนะนำให้ใช้ลูกบาศก์เดินในรูปทรงเรขาคณิตกับประสิทธิภาพสูงสุด นี่หมายความว่าฉันต้องเรียกใช้ shader หนึ่งครั้งสำหรับทุก voxel ในโดเมนและมันจะสร้างรูปทรงเรขาคณิตทั้งหมดในเซลล์นั้น

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

ดังนั้นมีบอกให้ OpenGL เพื่อเริ่มต้นการส่งผ่านการเรนเดอร์จาก shader เรขาคณิตโดยไม่มีเรขาคณิตอินพุตหรือไม่? หรือฉันจะต้องส่งจุดจำลองไปยัง GPU เพื่อให้ทำงานได้ตลอดเวลา

คำตอบ:


15

ไม่ไม่มีวิธีการทำเช่นนั้นจริงๆ

การเรียกใช้เรขาคณิต shader ต้องการอินพุตดั้งเดิมและสร้างเอาต์พุตพื้นฐาน 0 หรือมากกว่า หากไม่มีอินพุตดั้งเดิมไม่มีวิธีที่จะเรียกใช้ shader ทางเรขาคณิตได้ แน่นอนว่าคุณสามารถยืดขีด จำกัด ของจำนวนเอาต์พุตพื้นฐานของรูปทรงเรขาคณิตสำหรับแต่ละอินพุตดั้งเดิมได้ (ไม่ทราบขีด จำกัด ที่ใช้ได้จริงในตอนนี้ควรอยู่ในลำดับอาจเป็นพัน) ดังนั้นคุณอาจจะสามารถสร้าง 1,024 สามเหลี่ยมสำหรับแต่ละจุด แต่คุณต้องมีบางวิทยาการการป้อนข้อมูล

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

แต่สิ่งที่คุณทำจริง ๆ การแสดงจุดสำหรับแต่ละตารางเซลล์และสร้างลูกบาศก์เดินขบวนสำหรับเซลล์นั้นจากนั้นเป็นวิธีที่ตรงไปตรงมา แน่นอนว่าคุณลักษณะใดที่เซลล์นี้มีอยู่นั้นขึ้นอยู่กับคุณมันอาจเป็นตำแหน่ง 3D ซึ่งเป็นเท็กซัสลงในพื้นผิว 3 มิติไม่ว่าจะเป็นอะไรก็ตาม แต่สิ่งเหล่านั้นคือเซลล์กริดที่คุณแสดงผล พูดจริง ๆ แล้วคุณไม่ได้ "ทิ้ง" จุดเหล่านั้นแล้ว "แทนที่" พวกเขาด้วยรูปสามเหลี่ยมคุณเปลี่ยน "แต่ละจุด" เป็นรูปสามเหลี่ยม นั่นคือสิ่งที่ shader เรขาคณิตมีไว้สำหรับและไม่มีอะไร "แฮ็ค" หรือ "ไม่เหมาะสม" เกี่ยวกับมัน ไม่มีใครพูดว่า Shader เรขาคณิตที่มีการสร้างผลผลิตเดียวกันชนิดดั้งเดิมเช่นการป้อนข้อมูลจะเป็น "เหมาะสม"


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

ดังนั้นในการหวนกลับฉันควร relativate คำสั่งของฉันจากจุดเริ่มต้น: คุณไม่สามารถสร้างพื้นฐานโดยไม่ต้องป้อนข้อมูลใด ๆprimitivesแต่คุณสามารถสร้างได้โดยไม่ต้องป้อนข้อมูลใด ๆรูปทรงเรขาคณิต

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