Mengapa penggemar segitiga tidak didukung di Direct3D 10 atau yang lebih baru?

16

Seperti yang tercakup dalam dokumentasi, penggemar segitiga tidak didukung di Direct3D 10 atau lebih baru .

Mengapa? Apakah ada kelemahan bawaan untuk bekerja dengan penggemar segitiga?

Micah Bolen
sumber
5
Pemahaman saya adalah bahwa karena penggemar segitiga sering menghasilkan segitiga panjang yang sangat kurus yang mengakibatkan interop yang menyebabkan artefak. Juga saya pikir itu memerlukan panggilan imbang terpisah untuk membuat setiap percobaan yang tidak terhubung dengan kipas. Mana mungkin dengan Strip. Saya tidak berpikir ada penggemar yang bisa melakukan itu strip tidak bisa berbuat lebih baik.
ClassicThunder
3
Kipas dapat dihubungkan menggunakan indeks sehingga tidak perlu panggilan terpisah. Hal yang sama juga berlaku untuk strip (dan Anda bahkan dapat menghubungkan kipas dengan strip) yang jauh lebih fleksibel, tidak memerlukan tris yang merosot, dan lebih ringan dalam hal bandwidth.
Maximus Minimus

Jawaban:

15

Selama lebih dari satu dekade vendor perangkat keras telah mendorong strip segitiga, daftar segitiga diindeks dan strip segitiga diindeks sebagai jenis primitif tercepat untuk digunakan. Mengapa? Strip memiliki lokalitas cache yang lebih baik (menggunakan kembali 2 vert terakhir yang diserahkan daripada harus terus-menerus melompat kembali ke yang pertama) dan pengindeksan memungkinkan cache vertex perangkat keras untuk benar-benar berfungsi, serta lebih efektif untuk menghilangkan duplikat verts.

Jika semua vendor perangkat keras mengatakan "lakukan dengan cara ini dan Anda akan menjadi lebih cepat" maka ada peluang yang cukup bagus bahwa jika Anda melakukannya dengan cara ini Anda sebenarnya akan lebih cepat.

Jadi D3D10 + hanya memformalkan ini; jika itu jalur cepat maka jalur itulah yang akan Anda gunakan dan jalur lain tidak akan ada. Ini sesuai dengan salah satu filosofi desain D3D10 +, yaitu untuk menempatkan Anda di jalur cepat dan membuat Anda tetap di sana.

Maximus Minimus
sumber
4

Saya tidak tahu seberapa besar ini benar-benar mempengaruhi pengembangan, tetapi karena dengan perubahan seperti itu, dikatakan bahwa mereka akan membiarkan pengembang driver menulis driver yang lebih baik. Kompleksitas driver GPU luar biasa tetapi saya tidak yakin apakah perubahan yang tepat ini akan banyak membantu.

Dalam kedua kasus tersebut, Anda dapat mengganti kipas segitiga untuk sebagian besar kebutuhan Anda (seperti rendering poligon cembung) dengan strip, seringkali dengan hasil yang lebih baik.

// 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 ] );
}

EDIT: lupa menyebutkan - jika Anda perlu mengubah urutan berliku - hanya membalikkan tes di "jika" (== ke! =).

snake5
sumber
3

(Pertanyaan khusus ini menjamin jawaban pendapat :)

Secara subyektif, saya akan mengatakan astronotisme arsitekturnya. OpenGLES juga membuang banyak hal untuk membuatnya 'kurang kompleks' sementara sebenarnya hanya mendorong kompleksitas ke masing-masing dan setiap pengembang dengan kode warisan sebagai gantinya.

Tentu saja, bahkan ketika perangkat keras tidak mendukungnya secara alami, itu akan sepele untuk memberikan kompatibilitas dengan orang-orang yang mengurutkan penggemar segitiga dengan mengonversinya menjadi strip atau segitiga.

Run-time WebGL dan semacamnya harus melacak buffer yang divalidasi dan semacamnya sepanjang waktu, dan driver dapat dengan mudah mengatur orang-orang mengirim mereka penggemar meskipun mereka tidak mendukungnya.

Jadi seluruh membuang FFP dan semacamnya hanyalah gangguan besar IMO.

Akan
sumber
10 atau lebih tahun yang lalu ini akan menjadi jawaban yang bagus. Saat ini, pipeline vertex hampir selalu diimplementasikan dalam perangkat keras, dan data vertex lebih mungkin untuk disimpan dalam objek buffer dalam memori GPU, sehingga implementasi fan-to-strip hipotetis dalam driver akan memerlukan menarik data vertex kembali ke memori CPU untuk menyusun ulang, kemudian memuatnya kembali ke memori GPU. Itu tidak hanya merusak seluruh titik menggunakan objek buffer (karena Anda tidak lagi memiliki data vertex statis) tetapi juga memerlukan pembacaan kembali dari memori GPU, jadi halo pipa saluran dan kinerja rendah.
Maximus Minimus
1
@ mh01 hardware apa yang tidak mendukung fan secara asli? HW harus bekerja dengan OpenGL penuh ...
Will
Data vertex mungkin disimpan dalam memori GPU, tetapi harus sampai di sana dari memori sistem entah bagaimana di tempat pertama (setidaknya sekali). Itu melalui pengemudi. (Dengan asumsi data berasal dari sisi CPU, yang, kecuali untuk demo perangkat keras khusus, hampir selalu demikian).
BrainSlugs83