ทำไมพัดลมสามเหลี่ยมไม่รองรับ Direct3D 10 หรือใหม่กว่า


16

ในฐานะที่เป็นที่กล่าวถึงในเอกสารแฟนสามเหลี่ยมไม่ได้รับการสนับสนุนใน Direct3D 10 หรือในภายหลัง

ทำไม? การทำงานกับแฟน ๆ ของสามเหลี่ยมมีข้อเสียหรือไม่


5
ความเข้าใจของฉันคือเพราะแฟนสามเหลี่ยมมักจะส่งผลให้สามเหลี่ยมยาวผอมมากทำให้เกิดการทำงานร่วมกันทำให้เกิดสิ่งประดิษฐ์ นอกจากนี้ฉันคิดว่ามันต้องใช้การดึงสายแยกต่างหากเพื่อแสดงการพยายามใด ๆ ที่ไม่ได้เชื่อมต่อกับพัดลม ที่ไหนเป็นไปได้ด้วยแถบ ฉันไม่คิดว่าจะมีอะไรที่แฟน ๆ สามารถทำได้แถบนั้นทำไม่ได้ดีกว่า
ClassicThunder

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

คำตอบ:


15

เป็นเวลากว่าทศวรรษที่ผู้จำหน่ายฮาร์ดแวร์ผลักดันแถบสามเหลี่ยมรายการสามเหลี่ยมที่จัดทำดัชนีและแถบสามเหลี่ยมที่จัดทำดัชนีไว้เป็นประเภทดั้งเดิมที่เร็วที่สุดที่จะใช้ ทำไม? Strips มีตำแหน่งแคชที่ดีกว่า (การใช้ verts 2 ตัวสุดท้ายที่ส่งมาแทนที่จะต้องข้ามกลับไปที่ Ver1 แรกอย่างต่อเนื่อง) และการทำดัชนีช่วยให้แคชจุดสุดยอดของฮาร์ดแวร์ใช้งานได้จริงรวมทั้งมีประสิทธิภาพมากขึ้นสำหรับการกำจัด

หากผู้ค้าฮาร์ดแวร์ทุกคนบอกว่า "ทำแบบนี้และคุณจะได้เร็วขึ้น" จากนั้นมีโอกาสที่ค่อนข้างดีถ้าคุณทำอย่างนี้คุณจะเร็วขึ้น

ดังนั้น D3D10 + ก็ทำแบบนี้ หากเป็นเส้นทางที่รวดเร็วนั่นคือเส้นทางที่คุณจะใช้และเส้นทางอื่น ๆ จะไม่มีอยู่จริง สิ่งนี้สอดคล้องกับหนึ่งในปรัชญาการออกแบบของ D3D10 + ซึ่งจะนำคุณไปสู่เส้นทางที่รวดเร็วและทำให้คุณอยู่ที่นั่น


4

ฉันไม่ทราบว่าสิ่งนี้มีผลกระทบต่อการพัฒนาอย่างแท้จริง แต่เช่นเดียวกับการเปลี่ยนแปลงดังกล่าวมีคนบอกว่าพวกเขาจะให้นักพัฒนาโปรแกรมควบคุมเขียนไดรเวอร์ที่ดีขึ้น ความซับซ้อนของไดรเวอร์ GPU นั้นน่าทึ่ง แต่ฉันไม่แน่ใจว่าการเปลี่ยนแปลงที่แน่นอนนี้จะช่วยได้มากเพียงใด

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

// A simplified API interface is presented for the purposes of having readable pseudocode
// Push( pos ) - pushes position data to make a new vertex
// TRIANGLE FANS:
for( i = 0; i < vertices.count; ++i )
    Push( vertices[ i ] );

// TRIANGLE STRIPS:
for( i = 0; i < vertices.count; ++i )
{
    if( i % 2 == 0 )
        vertex = i / 2;
    else
        vertex = vertices.count - 1 - i / 2;
    Push( vertices[ vertex ] );
}

แก้ไข: ลืมพูดถึง - หากคุณต้องการเปลี่ยนลำดับการไขลาน - เพียงแค่ย้อนกลับการทดสอบใน "if" (== ถึง! =)


3

(คำถามนี้รับประกันความเห็น :)

ผมคิดว่ามันเป็นดาราศาสตร์เชิงสถาปัตยกรรม OpenGLES ยังโยนสิ่งต่างๆมากมายเพื่อทำให้มัน 'ซับซ้อนน้อยลง' ในขณะที่เพียงแค่เพิ่มความซับซ้อนให้กับนักพัฒนาทุกคนด้วยรหัสดั้งเดิมแทน

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

WebGL ทำงานเป็นเวลาและต้องติดตามบัฟเฟอร์ที่ตรวจสอบแล้วตลอดเวลาและไดรเวอร์สามารถจัดการคนที่ส่งแฟน ๆได้อย่างง่ายดายแม้ว่าพวกเขาจะไม่สนับสนุนก็ตาม

ดังนั้นการขว้างปาออกจาก FFP ทั้งหมดและเป็นเพียงIMO ที่น่ารำคาญ


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

1
@ mh01 ฮาร์ดแวร์ใดที่ไม่รองรับแฟน ๆ HW ต้องทำงานร่วมกับ OpenGL แบบเต็มหลังจากทั้งหมด ...
จะ

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